jvm垃圾回收策略

1.垃圾回收算法(也叫垃圾回收策略)

在jvm中用于垃圾回收的算法总共有三种:

  • 1.标记清除算法
  • 2.标记复制算法
  • 3.标记整理算法

2.垃圾回收判定规则

那么问题来了,什么样的对象在jvm中才能算是垃圾呢?
在java中,有两种判断当前对象是否是可以回收的垃圾:

  • 1.引用计数法
  • 2.可达性分析法

下面我们先看看什么是引用计数法

2.1 引用计数法

为对象添加一个引用计数器存储到一份额外的内存区域中进行记录,当有地方引用这个对象时,引用计数器的值就会+1,当引用失效时,计数器的值就会-1;当计数器的值为0的时候,也就说明当前对象再没有被其他的对象所引用,此时可以计入失效名单标记为待回收对象了;

引用计数器的方式简单明了,不过也伴随着一些问题没办法去解决。当两个对象相互依赖时,也就是循环依赖,此时两个对象即使不再被其他对象所依赖,他们的引用计数器的值也不会成为0,就没有办法被JVM回收了;

2.2 可达性分析法

可达性分析法是通过以所有的“GC Roots”对象为出发点,如果无法通过GC Roots的引用追踪到的对象,那我们认为这些对象就不会再次被使用了。
在这里插入图片描述

如上图,以GC Root作为出发点,被追踪的对象则表示处于存活状态的,而没有被GC Root所追踪的对象,则视为可被回收的对象;

在java中,如下对象可作为GC Root对象:

  • 1、虚拟机栈中的本地变量所引用的对象。

  • 2、方法区中静态属性引用的对象。

  • 3、方法区中常量引用的对象。

  • 4、本地方法中(Native方法)引用的对象。

  • 5、虚拟机内部的引用对象(类记载器、基本数据对应的Class对象,异常对象)。

  • 6、所有被同步锁(Synchronnized)持有的对象。

  • 7、描述虚拟机内部情况的对象(如 JMXBean、JVMTI中注册的回调、本地缓存代码)。

  • 8、垃圾搜集器所引用的对象。

3.垃圾回收算法分析

我们下面逐步分析一下这三种垃圾回收算法的优缺点以及使用场景

3.1 标记复制算法——新生代

在JVM中,标记复制算法应用于新生代中,新生代对象的特征是大多数对象都是朝生夕死,所以每次复制对象时,只需要复制那些被判定为还活着的对象即可;
通过Eden区和两个S区中间对象的复制从而实现回收。
这样做的好处是解决内存中不连续的零碎空间问题,并且GC效率高,它的不足之处在于由于两个S区只有一个被使用,另外一个处于空置状态,会有一片内存空间闲置。
在这里插入图片描述

3.2 标记清除算法——老年代

在JVM中,标记清除算法默认应用于老年代
标记清除算法是先标记对象是否存活,然后把标记为已死的对象统一清除;
在这里插入图片描述

红色部分为标记已死亡的对象,进行GC回收后得到右边的图;
由于老年代中的对象大多都是存活时间比较久的,所以每次GC的对象数量比较少,和新生代刚好相反;
我们通过右侧的图可以看到,GC后,内存中出现了不少连续的零碎的空间,也就是我们常说的空间碎片,这样的空间碎片不利于后续的内存空间的申请,造成一些大对象内存无法分配问题;同时,当内存中有大量对象需要被回收时,标记和清除比较耗时,容易造成系统性能不稳定;

3.3 标记整理算法

在JVM中,标记整理法是通过将标记的存活的对象移动到内存的另一端,最后将边界之外的区域的对象统一进行清除,这种做法可以避免空间碎片问题。如下图:
在这里插入图片描述

在上图中,首先先将存活的对象移动到内存的另一端,然后对余下的内存空间进行整体的清除,这样做的好处是可以解决零碎内存空间问题,不过当存活的对象较多时移动对象需要改变对象的引用地址,比较影响系统性能,同时也会很消耗内存空间;

当内存"另一端"的内存不够用时,还需要采用其他的手段来为这部分内存进行一个扩容,比如jvm中的内存担保机制。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ZNineSun

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值