垃圾回收机制

什么样的对象会被收集

  1. 可达性分析后,没有任何引用的对象(第一次标记)
  2. 该对象是否需要执行finalize()方法(第二次标记),不需要执行的对象直接判定死亡。
    需要执行finalize()方法的对象放到F-Queue队列,等待虚拟机去执行。执行完成之后再进行可达性分析,没有任何引用的对象判定死亡。
    其中finalize方法只会执行一次,下次如果再判定没有任何引用了,直接判定死亡。

Minor gc

步骤

1. GC时,新生代的分布是这样,eden区和s0区有objects1区为空;

2. eden区满时,触发MinorGC,将eden区和s0区尚存活的object,复制到s1区,顺利完成后,s0区和s1区命名互换一下;

3. MinorGC 中存活的object如果超过tenuring threshold,会promote到老生代;

4. 每次MinorGC后,都会计算一个合理的tenuring threshold和各年代区的size,以及适时地调整size

 

 

Full gc

触发条件,归根到级还是old区放不下要进来的对象,才会出现full gc

(1)System.gc是建议jvm进行full GC(可以配置XX:+ DisableExplicitGC来禁止RMI调用System.gc

(2)老年代空间不足(到了一定的年龄后,晋升到老年代,s区是正常的可以放得下

(3)永久代(方法区)空间不足(PermGen space

(4)CMS GC时出现promotion failedconcurrent mode failure

        promotion failed是指s区放不下old区也放不下

  concurrent mode failure是指用户线程产生的浮动垃圾和晋升的对象在old区放不下

(5)统计到晋升的平均值大于老年代的剩余空间

(6)堆中分配很大的很大的对象(old连续的空间不足)



========================================

标记清除算法有个缺点就是垃圾收集后,内存是不连续的

CMS垃圾收集器采用的标记-清除算法,所以可以提供两个配置进行整理碎片。1.+UseCMSCompactAtFullCollection配置表示,full gc时开启内存碎片的合并整理,但是过程是无法是并发的。2.+CMSFullGCsBeforeCompaction配置表示,执行多少次不压缩的gc后,跟着来一次带压缩的(默认是0,表示每次进入full gc 时都进行碎片整理)


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值