当前位置:首页 » 《休闲阅读》 » 正文

JVM如何识别“到底谁才是垃圾“?_HollisChuang's Blog

2 人参与  2021年04月28日 10:43  分类 : 《休闲阅读》  评论

点击全文阅读


什么样的对象可以称为垃圾对象?换句话说:在垃圾收集器工作的时候,那些对象是可以被回收的,哪些对象是不可以被回收的?判断的标准是什么?系统中的对象千千万,怎么才能准确无误的找出来并“杀”掉就显得尤为重要。

2、你才是垃圾

为了解决上面的问题。JVM 专门设计一套判断对象是的是垃圾的算法——可达性分析。

可达性分析的原理是:根据每一个对象,一层一层的引用往上找,说白了就是看看那些地方在引用着这个对象。直到找到能被称之为GC Roots的对象在引用这个这个对象,那么这个时候 JVM 就认为这个对象是不是垃圾对象。也就是在垃圾回收的时候是不会去回收这部分对象的。反之,这样的对象就可以被称为垃圾对象。也就意味着是会被在垃圾收集器工作的时候就会回收这部分对象。

3、GC Roots

说到这里,哪些是垃圾对象我们是可以判断了。那么刚刚提到的 GC Roots 又是什么鬼?简单的来讲,静态变量、局部变量、常量、本地方法栈中的对象。但是一般最常见的就是。静态变量、局部变量。

我们姑且先这个记住,也就是凡是被这些对象引用的对象,就是不能被回收的。换言之,系统是在某些地方还在使用这些对象。这些对象我们也称之为强引用。对应的还有软引用,弱引用和虚引用。

# 强引用(使用频率:☆☆☆☆☆)
	我们平时开发时候通过 new 关键创建出来的对象就是强引用,这类对象在垃圾回收的时候只要是能找到 G CRoots,那么他们是不会被回收的。

# 软引用(使用频率:☆☆☆☆)
	所谓软引用,就是表示该对象在垃圾回收期间,不软是否被其他对象引用,只要是内存空间不够了,那么该对象就会别垃圾收集器回收。
(PS:这个也是大家很容易和弱引用搞混淆的一个术语。我相信你平时开发常用的一定是 SoftReference ,而很少使用 WeakReference 。也就是说,强引用下面的一个就是软引用。希望能帮助大家理解这两个之间的区别。)

# 弱引用(使用频率:☆)
	这类引用存在的价值更容易被忽视,只要是在垃圾回收阶段,不管内存是否足够,该类型的对象都会被垃圾收集器回收。
	
# 虚引用(使用频率:程序员基本不会使用到)
	“虚引用”顾名思义,就是形同虚设,与其他几种引用都不同,虚引用并不会决定对象的生命周期。如果一个对象仅持有虚引用,那么它就和没有任何引用一样,在任何时候都可能被垃圾回收。虚引用主要用来跟踪对象被垃圾回收的活动。虚引用与软引用和弱引用的一个区别在于:虚引用必须和引用队列(ReferenceQueue)联合使用

点击全文阅读


本文链接:http://zhangshiyu.com/post/18089.html

引用  对象  垃圾  
<< 上一篇 下一篇 >>

  • 评论(0)
  • 赞助本站

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

关于我们 | 我要投稿 | 免责申明

Copyright © 2020-2022 ZhangShiYu.com Rights Reserved.豫ICP备2022013469号-1