第10课:jvm的gc中关于对象的age问题以及jvm的内存分配策略彻底详解

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/someby/article/details/83590380

内容:

    1.对象的Age的问题
    2.JVM的内存分配策略

一、JVM内存结构图

二、对象的Age的问题以及内存分配策略

详细文章:JVM的内存分配策略

    1.Eden中比较频繁的GC,每次GC都会导致内存分布的变化。对象的计数器:对象的Age是标记的关键。年轻代的GC又叫minor GC。对象GC年龄阈值默认是15。每次GC后还存活就将对象Age加1。
    2.实际运行的时候,Survive区域中,对象不一定要达到阀值就进入Old Generation。有这样一种情况,就是Survive中有这样一组对象,其Age是相同的,其总大小等于或超过Survive空间的一半,就会集体晋升为Old Generation对象。是一种程序运行的动态调整。
    3.新生代GC时,对象进入Old Generation不是一帆风顺,如果要进入对象的大小超过Old Generation剩余空间大小,就会发生Full GC。Full GC的耗时是新生代GC的好几十倍。
    4.如果进入Old Generation的对象少于Old Generation的剩余大小,是否需要Full GC由有参数HandlePromotionFailure决定。
    5.HandlePromotionFailure:是否担保失败,如果是进行担保失败,就不需要进行Full GC。如果不允许担保失败,就需要进行Full GC。我们一般打开这个开关,有OOM的风险,冒险来减少Full GC。所谓冒险:也就是说当用来轮转的Survivor区无法承受新生代中所存活的对象内存时,需要老年代进行分配担保,把Survivor无法容纳的对象直接进入老年代中,前提是老年代中
    5.大对象直接进入Old Generation,主要是一些数组,大的字符串,因为打对象会占用连续的内存空间,在Eden内进行大对象的拷贝效率比较低,作为性能考量,直接进入Old Generation更加合理。

猜你喜欢

转载自blog.csdn.net/someby/article/details/83590380