江的福的小本本JVM之GC Roots

前面一篇刚说了垃圾回收算法,但是我们只知道了怎么收垃圾,但却还没搞清楚哪些是垃圾,是不是有点喧宾夺主了呢。所以,这次来聊聊哪些是垃圾,如何判定这些垃圾。

简单来说,内存中不被引用到的空间就是垃圾。
因此,怎么来判定某些对象是否被引用到了呢?

1、引用计数法

这个之前说过了,需维护一个引用计数器,加之由于循环引用问题,基本上不会使用这种方法。

2、可达性分析法

所谓的GC Roots或者说Tracing GC的根集合就是一组必须活跃的引用

可达性分析基本思路是通过一系列名为GC Roots的对象作为起始点,从这个被称为GC Roots的对象开始向下搜索,如果一个对象到GC Roots没有任何引用链相连时,则说明此对象不可用。也即给定一个集合的引用作为根出发,通过引用关系遍历对象图,能被遍历到的(可到达的)对象被判定为存活,没有被遍历到的就自然被判定为死亡。
其实这里有点像并查集的逆思想,并查集是由底部往根部询问根,而这里是从根部开始遍历。(哈哈 这里是我瞎说的,因为阳哥举的那个江湖例子,就是我对并查集的理解。)

好了,知道了算法的基本思路,那么关键点就来到了那些能够成为GC Roots的对象呢?
1、虚拟机栈(栈帧中的局部变量区,也叫做局部变量表)中引用的对象。
2、方法去中的类静态属性引用的对象。
3、方法区中常量引用的对象。
4、本地方法栈中JNI(Native方法)引用的对象。

发布了51 篇原创文章 · 获赞 11 · 访问量 1754

猜你喜欢

转载自blog.csdn.net/weixin_45276914/article/details/105538755