Java虚拟机学习(7):对象内存分配与回收

对象优先在Eden上分配

大多数情况下,对象优先在新生代Eden区域中分配。当Eden内存区域没有足够的空间进行分配时,虚拟机将触发一次 Minor GC(新生代GC)。Minor GC期间虚拟机将Eden区域的对象移动到其中一块Survivor区域。

大对象直接进入老年代

所谓大对象是指需要大量连续空间的对象。虚拟机提供了一个XX:PretenureSizeThreshold参数,令大于这个值的对象直接在老年代中分配。

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

虚拟机采用分代收集的思想管理内存,那内存回收时就必须能识别那些对象该放到新生代,那些该到老年代中。为了做到这点,虚拟机为每个对象定义了一个对象年龄Age,每经过一次新生代GC后任然存活,将对象的年龄Age增加1岁,当年龄到一定程度(默认为15)时,将会被晋升到老年代中,对象晋升老年代的年龄限定值,可通过-XX:MaxTenuringThreshold来设置。

Minor GC 和Full GC区别

新生代GC(Minor GC):指发生在新生代的垃圾收集动作,因为对象大多都具备朝生夕灭特性,所以Minor GC非常频繁,回收速度也比较快。
老年代GC(Major GC / Full GC):指发生在老年代中的GC,出现Major GC后,经常会伴随至少一次的 Minor GC。Major GC的速度一般会比Minor GC慢10倍以上。

本系列:



相关文章

发表评论

Comment form

(*) 表示必填项

3 条评论

  1. 史锦明 说道:

    几点疑问:
    1、对象分配到Eden中时,如果Eden没有足够的空间,就会触发一次minor GC, 这里的minor GC的范围是Eden space吗? 如果是的话,那么存活下来的对象的age的值永远是等于1, 并且会把这个age=1的对象复制到Survivor里面,接下来Survivor里面的对象永远都进不了老年代了?

    2、文中提到的minor GC期间虚拟机将Eden区域的对象移动到其中一块Survivor区域,是指的minor GC对对象清理完之后再做移动,还是一边GC一边移动,如果是采用标记-清除算法还需要移动吗?

    Thumb up 0 Thumb down 0

  2. 史锦明 说道:

    还有另外一块Survivor什么时候会用到啊? Full GC在什么时候执行啊?

    Thumb up 0 Thumb down 0

  3. 史锦明 说道:

    minor GC 和 Full GC 采用什么垃圾回收算法,或者说可不可以支持配置?

    Thumb up 0 Thumb down 0

跳到底部
返回顶部