Java中GC的两种判定算法

1、引用计数法

在JDK1.2之前,使用的是引用计数器算法,即当这个类被加载到内存之后,就会产生方法区,堆栈、程序计数器等一系列信息,当创建对象的时候,为这个对象在堆栈空间中分配内存,同时会产生一个引用计数器,设置引用计数器为1,当有新的引用时,引用计数器继续+1,而当其中一个引用销毁时,引用计数器-1,当引用计数器减为0的时候,标志着这个对象已经没有引用了,可以回收了!但是这样会有一个问题:当我们的代码出现这样的情况时:

a)A.ref=B

b)B.ref=A

这样的代码会产生如下引用情形A指向B,而B又指向A,这样当其他所有的引用都消失了之后,A和B还有一个相互的引用,也就是说两个对象的引用计数器各为1,而实际上这两个对象都已经没有额外的引用,已经是垃圾了。

2、根搜索算法

根搜索算法是从离散数学中的图论引入的,程序把所有的引用关系看做一张图,从一个节点GC Root开始,寻找对应的引用节点,找到这个节点之后,继续寻找这个节点的引用节点,当所有的引用节点寻找完毕之后,剩余的节点则被认为是没有被引用到的节点,即无用的节点。从图的遍历的角度来看,把对象看做图中的一个节点,对象之间的引用看做图中的边,遍历后,最终的孤立点就是没有被引用的点,可以视为垃圾。

目前Java中可作为GC Root的对象有:(两栈两区)

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

4.本地方法栈中引用的对象(Native对象)。

2.方法区中静态属性引用的对象

3.方法区中常量引用的对象

发布了19 篇原创文章 · 获赞 0 · 访问量 259

猜你喜欢

转载自blog.csdn.net/wangqsse/article/details/105106114