【JVM】内存分配和回收策略

对象优先在Eden分配

​ 大多数情况下,对象在新生代Eden区中分配,当Eden区没有足够空间分配时将触发youngGC

大对象直接进入老年代

​ 大对象是指需要大量连续内存空间的对象,最典型的就是很长的字符串。

​ 可以设置*-XX:PretenureSizeThreshold*参数,指定大于该值的对象直接在老年代分配,这样做的目的是避免在Eden区和两个Survivor区之间来回复制,产生大量内存复制操作。

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

​ 虚拟机每个对象都定义了一个对象年龄计数器,对象在Eden出生后,第一次youngGC后仍然存活,并且能被Survivor容纳。就会被移动到Survivor空间,并将年龄设置为1,对象在Survivor每熬过一次youngGC,年龄就+1,当他年龄到15后,会进入老年代。

动态年龄判断

​ 为了更好适应不同程序内存状况,并不是永远要求对象年龄必需达到15。

如果在Survivor空间中相同年龄所有对象大小的总和大于Survivor空间的一半,年龄大于等于该年龄的对象可以直接进入老年代。

空间分配担保机制

在发生Minor GC之前,虚拟机会检查老年代最大可用的连续空间是否大于新生代所有对象的总空间

    如果大于,则此次Minor GC是安全的

    如果小于,则虚拟机会查看HandlePromotionFailure设置值是否允许担保失败。如果HandlePromotionFailure=true,那么会继续检查老年代最大可用连续空间是否大于历次晋升到老年代的对象的平均大小,如果大于,则尝试进行一次Minor GC,但这次Minor GC依然是有风险的;如果小于或者HandlePromotionFailure=false,则改为进行一次Full GC

全部评论

相关推荐

野猪不是猪🐗:把你的学校加黑,加粗,斜体,下划线,描边,内阴影,内发光,投影,外发光,再上渐变色,居中,放大到最大字号,再把简历里其它内容删了,就行了
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务