Java虚拟机如何判断对象已死?(哪些内存需要回收)

JVM管理的堆内存中,几乎存放了所有的对象实例,如果一个对象已经使用完毕(没有任何引用指向它),那么,该对象所占用的内存应该被回收利用,而这些工作就是JVM垃圾收集器的工作

垃圾收集器在对堆内存进行回收之前,第一件事情就是要确定哪些对象还“存活”,哪些已经“死去”,其内存将要被回收,下面就来讲——根搜索算法


在讲根搜索算法之前,因为一个对象在没有任何引用指向它的时候,其所占内存才具备回收添加,那我们先来讲讲什么事引用

传统意义的引用:如果reference类型的数据中存储的数据代表的是另一块内存的起始地址,就称这块内存代表着一个引用

引用的新概念:引用分为强引用、软引用、弱引用、虚引用,这四种引用强度依次逐渐减弱

1、强引用:强引用就是指程序代码中普遍存在的,类似 Object a = new Object() 这类的引用,只要引用还存在,垃圾收集器永远不会回收掉该引用对象所占内存

2、软引用:软引用用来描述一些还有用,但并非必需的对象。对于软引用关联着的对象,在内存不足,将要发生内存溢出异常之前,将会把这些对象列入回收范围之中并进行第二次回收。

3、弱引用:用来描述非必需对象,强度比软引用更弱一些,被弱引用关联的对象只能生存到下一次垃圾收集发生之前,当垃圾收集器工作时,无论当前内存时候足够,都将其回收。

4、虚引用:它是最弱的一种引用关系。一个对象是否有虚引用存在,完全不会对其生存时间构成影响,也无法通过虚引用来取得对象实例。它的唯一目的就是希望能在这个对象被收集器回收时收到一个系统通知。


那么我们来说说根搜索算法,判断一个对象是否具备被回收的条件

这个算法的基本思路就是通过一系列的名为”GC Roots“的对象作为起始点,从这些节点开始向下搜索,搜索搜走过的路径为引用链,当一个对象到GC Roots没有任何引用链相连接时,则证明此对象是不可用的,不可达的,应该被回收。如图示:

技术分享

在Java语言里,可作为GC Roots的对象包括下面几种:

虚拟机栈(栈帧中的本地变量表)中的引用的对象。

方法区中的类静态属性引用的对象。

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

本地方法栈中JNI(即一般说的Native方法)的引用的对象。



郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。