什么样的对象可以称为垃圾对象?换句话说:在垃圾收集器工作的时候,那些对象是可以被回收的,哪些对象是不可以被回收的?判断的标准是什么?系统中的对象千千万,怎么才能准确无误的找出来并“杀”掉就显得尤为重要。
2、你才是垃圾
为了解决上面的问题。JVM 专门设计一套判断对象是的是垃圾的算法——可达性分析。
可达性分析的原理是:根据每一个对象,一层一层的引用往上找,说白了就是看看那些地方在引用着这个对象。直到找到能被称之为GC Roots的对象在引用这个这个对象,那么这个时候 JVM 就认为这个对象是不是垃圾对象
。也就是在垃圾回收的时候是不会去回收这部分对象的。反之,这样的对象就可以被称为垃圾对象。也就意味着是会被在垃圾收集器工作的时候就会回收这部分对象。
3、GC Roots
说到这里,哪些是垃圾对象我们是可以判断了。那么刚刚提到的 GC Roots 又是什么鬼?简单的来讲,静态变量、局部变量、常量、本地方法栈中的对象。但是一般最常见的就是。静态变量、局部变量。
我们姑且先这个记住,也就是凡是被这些对象引用的对象,就是不能被回收的。换言之,系统是在某些地方还在使用这些对象。这些对象我们也称之为强引用。对应的还有软引用,弱引用和虚引用。
# 强引用(使用频率:☆☆☆☆☆)
我们平时开发时候通过 new 关键创建出来的对象就是强引用,这类对象在垃圾回收的时候只要是能找到 G CRoots,那么他们是不会被回收的。
# 软引用(使用频率:☆☆☆☆)
所谓软引用,就是表示该对象在垃圾回收期间,不软是否被其他对象引用,只要是内存空间不够了,那么该对象就会别垃圾收集器回收。
(PS:这个也是大家很容易和弱引用搞混淆的一个术语。我相信你平时开发常用的一定是 SoftReference ,而很少使用 WeakReference 。也就是说,强引用下面的一个就是软引用。希望能帮助大家理解这两个之间的区别。)
# 弱引用(使用频率:☆)
这类引用存在的价值更容易被忽视,只要是在垃圾回收阶段,不管内存是否足够,该类型的对象都会被垃圾收集器回收。
# 虚引用(使用频率:程序员基本不会使用到)
“虚引用”顾名思义,就是形同虚设,与其他几种引用都不同,虚引用并不会决定对象的生命周期。如果一个对象仅持有虚引用,那么它就和没有任何引用一样,在任何时候都可能被垃圾回收。虚引用主要用来跟踪对象被垃圾回收的活动。虚引用与软引用和弱引用的一个区别在于:虚引用必须和引用队列(ReferenceQueue)联合使用