颜色课堂开课了。黑在使用Java做项目的时候,一直对虚拟机如何自动回收实例对象感到好奇。但是又不知道如何去了解。于是,就去请教白。
第3章 垃圾收集器与内存分配策略
3.2 对象已死
黑:JVM是如何进行垃圾回收的?
白:JVM是通过后台应用程序对无用的Java对象进行垃圾回收,一般有标记-清除算法,复制算法,标记-整理算法等,垃圾回收算法。不过,在了解垃圾回收之前,我认为你应该先了解一下,什么样的对象才算是垃圾,可以用来回收。
黑:那,怎么样的对象才是可以被回收的对象呢?
白:对象是否可以被回收,则涉及到判断对象的是否已经无用。一般情况下,使用计算器算法,或者是根索引算法来判断一个对象是否已死。
白:计数器算法,是通过给每一个对象都添加一个计算器,当该对象每被调用一次则计算器加1,调用结束则计数器减1,当计数器为0时表示当前对象没有被其他对象引用,可以被回收。当然,计数器算法也有很明显的缺点:当两个对象循环引用的时候,则计数器值不为0,无法识别出对象已死,造成内存泄漏。
白:根索引算法,程序通过一系列的GC Roots节点向下搜索,如果搜索到,则表示该对象仍然存活,被其他对象引用。即可达;反之,对象已死(不可达)。这时对象可以被GC回收。现在的通用JVM都是使用GC Roots的方式进行判断对象是否已死。
黑:我大概明白了,只是根索引算法中,我们是如何确定Roots节点的?
白:要确定Roots节点,有一下这些方式
。虚拟机栈中的引用对象
。本地方法栈中的引用对象
。方法区中的常类引用对象
。方法区中的静态变量引用对象
通过这四种方式确定Roots节点。
黑:这下我明白了。在JVM进行垃圾回收前需要判断该对象是否可以被回收。并且有计算器算法和根索引算法。而现代JVM都是使用根索引算法进行判断。
白:对,这就是判断对象是否可以被回收的内容。Java的垃圾回收我们先讲到这里吧。黑,你回去理解记住这些内容。下次我再给你讲:在判断对象可回收之后,JVM是如何进行回收的。