垃圾回收主要思考三件事情:
- 哪种内存需要回收?
- 什么时候回收?
- 怎么回收?
这是一种非常简单易理解的回收算法。每当有一个地方引用一个对象的时候则在引用计数器上 +1,当失效的时候就 -1,无论什么时候计数器为 0 的时候则认为该对象死亡可以回收了。
这种算法虽然简单高效,但是却无法解决循环引用的问题,因此 Java 虚拟机并没有采用这种算法。
可达性算法是通过一个称为 GC Roots 的对象像下搜索,整个搜索路径就称为引用链,当一个对象到 GC Roots 没有任何引用链 JVM 就认为该对象是可以被回收的。
如图:Object1,2,3,4 都是存活的对象,而 Object5、6、7都是可回收对象。
可以用作 GC-Roots 的对象有:
- 方法区中静态变量所引用的对象。
- 虚拟机栈中所引用的对象。
标记清楚算法分为两个步骤,标记和清除。 首选将需要回收的对象标记起来,然后统一清除。但是存在两个主要的问题:
- 标记和清除的效率都不高。
- 清楚之后容易出现不连续内存,当需要分配一个较大内存时就不得不需要进行一次垃圾回收。
