# 《JVM核心技术》第05章:JVM堆内存分配机制

大家好,我是冰河~~

JVM内存空间 (opens new window)》一文提到了,创建对象的时候,对象是在堆内存中创建的。但堆内存又分为新生代和老年代,新生代又细分Eden空间、From Survivor空间、To Survivor空间。我们创建的类到底在哪里?

# 对象优先在Eden分配

堆内存分为新生代和老年代,新生代是用于存放使用后准备被回收的对象,老年代是用于存放生命周期比较长的对象。大部分我们创建的对象,都属于生命周期比较短的,所以会存放在新生代。新生代又细分Eden空间、From Survivor空间、To Survivor空间,我们创建的对象,对象优先在Eden分配。


随着对象的创建,Eden剩余内存空间越来越少,就会触发Minor GC,于是Eden的存活对象会放入From Survivor空间。


Minor GC后,新对象依然会往Eden分配。


Eden剩余内存空间越来越少,又会触发Minor GC,于是Eden和From Survivor的存活对象会放入To Survivor空间。


# 大对象直接进入老年代

在上面的流程中,如果一个对象很大,一直在Survivor空间复制来复制去,那很费性能,所以这些大对象直接进入老年代。可以用XX:PretenureSizeThreshold来设置这些大对象的阈值。


# 长期存活的对象将进入老年代

在上面的流程中,如果一个对象Hello_A,已经经历了15次Minor GC还存活在Survivor空间中,那他即将转移到老年代。这个15可以通过-XX:MaxTenuringThreshold来设置的,默认是15。虚拟机为了给对象计算他到底经历了几次Minor GC,会给每个对象定义了一个对象年龄计数器。如果对象在Eden中经过第一次Minor GC后仍然存活,移动到Survivor空间年龄加1,在Survivor区中每经历过Minor GC后仍然存活年龄再加1。年龄到了15,就到了老年代。


# 动态年龄判断

除了年龄达到MaxTenuringThreshold的值,还有另外一个方式进入老年代,那就是动态年龄判断:在Survivor空间中相同年龄所有对象大小的总和大于Survivor空间的一半,年龄大于或等于该年龄的对象就可以直接进入老年代。

比如Survivor是100M,Hello1和Hello2都是3岁,且总和超过了50M,Hello3是4岁,这个时候,这三个对象都将到老年代。


# 空间分配担保

上面的流程提过,存活的对象都会放入另外一个Survivor空间,如果这些存活的对象比Survivor空间还大呢?整个流程如下:

  1. Minor GC之前,虚拟机会先检查老年代最大可用的连续空间是否大于新生代所有对象总空间,如果大于,则发起Minor GC。
  2. 如果小于,则看HandlePromotionFailure有没有设置,如果没有设置,就发起full gc。
  3. 如果设置了HandlePromotionFailure,则看老年代最大可用的连续空间是否大于历次晋升到老年代对象的平均大小,如果小于,就发起full gc。
  4. 如果大于,发起Minor GC。Minor GC后,看Survivor空间是否足够存放存活对象,如果不够,就放入老年代,如果够放,就直接存放Survivor空间。如果老年代都不够放存活对象,担保失败(Handle Promotion Failure),发起full gc。

# 写在最后

在冰河的知识星球有大量从零开始带你手写的企业级生产项目,像DeepSeek大模型、手写高性能熔断组件、手写通用指标上报组件、手写高性能数据库路由组件、分布式IM即时通讯系统、Sekill分布式秒杀系统、手写RPC、简易商城系统等等,这些项目的需求、方案、架构、落地等均来自互联网真实业务场景,让你真正学到互联网大厂的业务与技术落地方案,并将其有效转化为自己的知识储备。

值得一提的是:冰河自研的Polaris高性能网关比某些开源网关项目性能更高,并且冰河也正在为企业级高性能RPC框架录制视频,全程带你分析原理和手撸代码。 你还在等啥?不少小伙伴经过星球硬核技术和项目的历练,早已成功跳槽加薪,实现薪资翻倍,而你,还在原地踏步,抱怨大环境不好。抛弃焦虑和抱怨,我们一起塌下心来沉淀硬核技术和项目,让自己的薪资更上一层楼。


目前,领券加入星球就可以跟冰河一起学习《DeepSeek大模型》、《手写高性能通用熔断组件项目》、《手写高性能通用监控指标上报组件》、《手写高性能数据库路由组件项目》、《手写简易商城脚手架项目》、《手写高性能RPC项目》和《Spring6核心技术与源码解析》、《实战高并发设计模式》、《分布式Seckill秒杀系统》、《分布式IM即时通讯系统》和《手写高性能Polaris网关》,从零开始介绍原理、设计架构、手撸代码。

花很少的钱就能学这么多硬核技术、中间件项目和大厂秒杀系统与分布式IM即时通讯系统,比其他培训机构不知便宜多少倍,硬核多少倍,如果是我,我会买他个十年!

加入要趁早,后续还会随着项目和加入的人数涨价,而且只会涨,不会降,先加入的小伙伴就是赚到。

另外,还有一个限时福利,邀请一个小伙伴加入,冰河就会给一笔 分享有奖 ,有些小伙伴都邀请了50+人,早就回本了!

# 其他方式加入星球

  • 链接 :打开链接 http://m6z.cn/6aeFbs 加入星球。
  • 回复 :在公众号 冰河技术 回复 星球 领取优惠券加入星球。

特别提醒: 苹果用户进圈或续费,请加微信 hacker_binghe 扫二维码,或者去公众号 冰河技术 回复 星球 扫二维码加入星球。

# 联系冰河

# 加群交流

本群的宗旨是给大家提供一个良好的技术学习交流平台,所以杜绝一切广告!由于微信群人满 100 之后无法加入,请扫描下方二维码先添加作者 “冰河” 微信(hacker_binghe),备注:星球编号

冰河微信

# 公众号

分享各种编程语言、开发技术、分布式与微服务架构、分布式数据库、分布式事务、云原生、大数据与云计算技术和渗透技术。另外,还会分享各种面试题和面试技巧。内容在 冰河技术 微信公众号首发,强烈建议大家关注。

公众号:冰河技术

# 视频号

定期分享各种编程语言、开发技术、分布式与微服务架构、分布式数据库、分布式事务、云原生、大数据与云计算技术和渗透技术。另外,还会分享各种面试题和面试技巧。

视频号:冰河技术

# 星球

加入星球 冰河技术 (opens new window),可以获得本站点所有学习内容的指导与帮助。如果你遇到不能独立解决的问题,也可以添加冰河的微信:hacker_binghe, 我们一起沟通交流。另外,在星球中不只能学到实用的硬核技术,还能学习实战项目

关注 冰河技术 (opens new window)公众号,回复 星球 可以获取入场优惠券。

知识星球:冰河技术

好了,今天就到这儿吧,我是冰河,我们下期见~~