JVM垃圾回收小结

判断对象死亡

引用计数算法

引用则计数+1,缺点:无法解决循环引用

可达分析法

通过一些列的成为GC Roots 的对象作为起点,从这些节点开始向下搜索,搜索所走过的路径成为引用链。如果一个对象到GC roots没有任何引用相连时,则证明此对象时不可用的

可作为GC Roots的对象:
1. 虚拟机栈(栈帧中的本地变量表)中引用的对象
2. 方法区中类静态属性引用的对象
3. 方法区中常量引用的对象
4. 本地方法栈中JNI(即一般说的Native方法)引用的对象

引用类型

1.强引用 如Object obj = new Object()
2.软引用 有用但非必须,内存不够的时候,会回收之
3.弱引用 更弱,只会生存到下次回收之前,不管够不够,都会回收之
4.虚引用 最弱,回收时会通知一下

内存空间分配

1.对象优先在Eden上分配
2.大对象直接进入老年代
3.长期存活的对象将进入老年代

垃圾收集算法

标记-清除

1.标记要清除的对象
2.标记完成后,统一清除所标记的对象
缺点:1.标记和清除这两个操作效率低。2.空间问题,标记清除后会产生大量不连续的内存碎片,碎片太多可能会导致在需要分配大对象时,无法找到足够的连续内存

复制-清除

研究表明,新生代98%的对象都“朝生夕死”。
将内存分为1块较大Eden(一般0.8)空间和2块较小的survior空间。每次使用Eden和其中的一块survior,当回收时,将Eden和survior中还存活的对象全部复制到另一survior中,然后清理之。可以看出,总有一块survior保持空闲,浪费空间为10%。如果大量对象存活,survior装不下,就需要老年代进行分配担保,把survior无法容纳的对象直接进入老年代。

标记-整理

复制算法在对象存活率较高时效率低,例如老年代。相比于标记-清除,标记-整理多了一步整理:让所有存活的对象都向一端移动,然后清除端边界以外的内存。

分代收集

新生代:复制-清除
老年代:标记-清除 or 标记-整理

什么时候GC

GC分为 minor GC 和 Full GC(也叫Major GC)
1.如果 Eden区域没有足够的空间,那么就会发起一次 Minor GC
2.对于 Full GC(Major GC)的触发条件:也是如果老年代没有足够空间的话,那么就会进行一次 Full GC
3. 空间分配担保
在minor GC前,虚拟机会检查老年代最大可用的连续空间是否大于新生代所有对象空间,如成立,minor GC安全进行。否则,会查看HandlePromotionFailure设置值是否允许担保失败。如果允许,会检查老年代最大连续空间是否大于历次晋升到老年代对象的平均大小,如果大于,会尝试进行minor GC。否则 进行full GC

对什么

从root搜索不到,而且经过第一次标记、清理后,仍然没有复活的对象

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值