GC什么样对象需要被回收?垃圾回收算法有哪些?如何选择垃圾回收器?如何选择?

都知道Java垃圾回收都是交给JVM来处理,什么时机、如何处理了解不多,可以查看此篇文章。如果了解,浏览文章一起交流。分为三个模块:什么样对象需要回收?回收算法有哪些?如何选择垃圾回收器?

java中有了垃圾自动回收机制,让程序员更多的关注业务,不必考虑内存的释放。所以自动垃圾算法就变的很重要了,
如果算法不合理,导致一些内存不释放,从而就导致内存溢出。

一 什么样对象需要被回收?

垃圾回收机制通过一套的有效的算法计算,什么对象有效,什么对象无效。对于无效的对象进行回收。
常见的计算对象的有效无效两种方法:引数计数法、可达性分析算法。

备注:
	计算对象是否有效算法和收集垃圾算法是两回事。计算对象是否有效之后,进行对象对象回收的
	算法(垃圾回收算法)。

1.1 引数计数法

1. 原理

假设一个对象a,被引用一次,那么a应用计数器会加1。引用失败时,a计算器减1。
当a的计数器的值为0,说明对象a没被引用,可以被回收。

2. 优缺点
优点:

回收的及时性高,因为不会等到内存不足来回收对象,直接根据对象的计数器为0进行回收。
在垃圾回收过程中,应用无需挂起。
区域性,在更新计数器只会影响该对象,不会扫描全部对象。

缺点:

每次对象应用,去更新计数器,有一点时间开销。
无法解决循环引用。

1.2 可达性分析算法(重点)

一系列称为“GC Roots”的根对象作为起始节点集。如果某一个对象到节点集没有引用,则称该对象不可达,
可以被回收。

在这里插入图片描述
1. 在虚拟机中被成为GC Roots对象有哪些?(了解)
a 虚拟机栈中的引用对象。
b 方法区中,静态属性引用对象。
c 方法区中,常量引用对象。
d 本地方法栈中JNI引用对象。
e 同步锁持有对象
f Java虚拟机内部的引用。

2. 对象的引用
强引用:不会被回收。

软引用:内存发生泄漏之前,会进行二次回收。如果这次回收没有足够内存,抛出内存溢出异常。

弱引用:活到下一次垃圾回收为止。

虚引用:无法通过一个虚引用获取对象,虚引用唯一目的就是,对象被回收时,收到一个系统通知。

二 垃圾回收算法有哪些?

2.1 标记清除

1. 原理
分为两个阶段,标记和清除。
标记:从根节点标记被引用对象。
清除:未被标记的对象为垃圾对象,可以被清理。
在这里插入图片描述
2. 缺点
执行效率低,在GC需要停止应用程序。而且在标记和清除都需要对所有对象便利。
内存碎片化计较严重,因为无效的对象被收集,内存不连续,收集后,可用内存变
成一片一片。

2.2 标记压缩

1. 原理
也是先标记引用对象。然后将被

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值