您的位置:首页 > 编程语言 > Java开发

垃圾收集与分配策略——(五)内存分配与回收策略

2017-09-29 00:13 429 查看
内存分配与回收规则
    内存分配与回收规则由垃圾回收器和内存有关参数决定,不是固定的。
    两个概念:
        MinorGC,次收集:在新生代发生的垃圾收集,速度快,发生频繁。
        FullGC,MajorGC,主收集:发生在年老代的垃圾收集。一般伴随一次MinorGC。

    一般的规则:
        对象优先在Eden分配。当Eden没有足够的空间时,虚拟机将发起一次MinorGC。
        大对象直接进入老年代。大对象是指需要连续内存空间的Java对象。目的是避免在Eden区及两个Survivor区之间大量的内存复制(新生代采用复制算法收集内存)。
        长期存活对象将进入老年代。虚拟机给每个对象定义一个对象年龄计数器,如果对象在Eden出生并经过一次Minor GC后仍然存活,并且能够被Survivor容纳,将被移动到Survivor空间,并且对象年龄设为1。对象在Survivor区中每“熬过”一次MinorGC,年龄就加1,达到某个阀值就晋升到年老代。
        空间分配担保。在发生Minor GC之前,虚拟机会先检查年老代最大可用的连续空间算法大于新生代所有对象总空间,如果是,那么Minor GC可以确保是安全的。如果否,虚拟机会查看HandlePromotionFailure设置是否允许担保失败。如果允许继续检查老年代最大可用的连续空间是否大于历次晋升到老年代对象的平均大小,如果大于,将尝试进行一次Minor
GC,这是有风险的(存活对象占用的内存大于平均大小,将导致HandlePromotionFailure失败,重新发起一次Full GC);如果小于或者HandlePromotionFailure设置不允许冒险,将改为Full GC。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息