JVM GC原理

GC.png

1.对象怎么判定已死:

1.对象引用计数法
每个对象都有一个引用计数器,当引用计数器归零时,即可判定对象已死。但是在互相引用的情况下,无法判定他们是否已死。

2.图论(节点不可达)
从GC root对象开始,如果发现有一个点,或者一个区域不可达,即判定这个区域的对象已死。

GC ROOT对象:
1.方法区静态变量的对象引用的对象。
2.方法区常量引用的对象引用的对象。
3.方法栈中局部变量表中的对象引用的对象。
4.本地方法栈的对象引用的对象。

2.方法区回收:

1.常量回收
没其他地方引用这个字面量了。
2.类卸载(同时满足)
1>.这个类在程序没有任何实例的存在。
2>.类加载器被回收了。
3>.字节码对象没有被任何地方使用,没反射的功能存在了。

3.怎么回收?

回收算法:
1.标记清除
容易产生大量的碎片,内存利用率越来越低。

2.标记-复制-清除
内存划分为两等份,回收一份后,直接复制到另一份。解决碎片的问题,但是整个内存的利用效率太低。

3.标记-整理-清除
把存活对象,向内存的一边移动,然后进行边界之外的内存进行清除。方法区的 大多对象时长久存活的,一般选择整个方式。

4.分代复制算法
应用于堆这种有大量的朝生夕灭的对象的区域,新生代分为一个Eden区和两个survive区,比例8:1:1。第一次进行MinorGC回收时,存活的进行survive区,到达一定年龄或者条件时进入老年代。

永久区是方法区,年轻代和老年代是堆。

4.回收的策略:

1.对象优先分配Eden区,大对象直接进行老年代,长期存活的对象进入老年代。避免大对象在新生代拷贝浪费资源。特别是朝生夕灭的大对象。

2.年龄计数器,达到一定年龄即进入老年代。

3.动态判断年龄,当相同年龄的对象的值大于Surviver空间的一半,大于等于这个年龄 的对象进入老年代。

4.空间担保:
MinorGC后可能出现,存活对象大于survive空间的大小,那就需要老年代作为担保人。
在MinorGC前,判断前面进入老年代的平均值是否大于老年代剩下的值,大于FullGC,小于并且担保打开,进行MinorGC,否则上一步。如果担保失败,那再进行一次FullGC。
为了减少FullGC的次数。

从年轻代空间(包括 Eden 和 Survivor 区域)回收内存被称为 Minor GC,对老年代GC称为Major GC,而Full GC是对整个堆来说的.

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值