jvm05

GC之标记

       堆分为年轻代和年老代。永久代是非堆内存,它又叫做方法区(一般的说法),主要存储已被加载的类信息、常量、静态变量。而该区域在java8已被删除,取而代之的是元空间。

 1.标记

   标记就是对一些已死的对象打上记号,方便垃圾收集器的清理。 至于怎么标记,一般有两种方法:引用计数和可达性分析。 

   (1)引用计数实现起来比较简单,就是给对象添加一个引用计数器,每当有一个地方引用它时就加1,引用失效时就减1,当计数器为0的时候就标记为可回收。这种判断效率很高,但是很多主流的虚拟机并没有采用这种方法,主要是因为它很难解决几个对象之间循环引用的问题,比如:类Test有Object成员属性element。创建两个Test类的对象:t1和t2。main中执行t1.element=t2; t2.element = t1;

2.可达性分析

基本思路如下:

通过将一些称为”GC Roots”的对象作为起始点,从这些节点开始搜索,搜索和该节点发生直接或者间接引用关系的对象,将这些对象以链的形式组合起来,形成一张“关系网”,又叫做引用链。最后垃圾收集器就回收那些不在这张关系网上的对象。

和该引用链还有链接的是能确定对象是活着的。如果没有和GC ROOTS进行连接,那么则说明是可以被清除的对象。在java中,有四种对象可以作为“GC Roots”:栈帧(第一章的名词)中的引用对象。(栈中的);静态属性引用的对象。(方法区中的);常量引用的对象。(方法区中的);本地方法栈中JNI引用的对象。(本地方法栈中的)。

猜你喜欢

转载自blog.csdn.net/Burgess_Lee/article/details/81781184