垃圾回收一般操作都为检测出垃圾对象,释放垃圾对象所占用的空间。检测垃圾对象主要有两种算法:引用计数法和可达性分析法
1.引用数法
堆中每个对象都有一个引用计数,当其他地方引用对象时,引用计数就会加一,某一处引用失效时,引用计数减一。任何引用计数为零的对象都可以被回收。优点判定效率高,缺点两个对象相互引用时,会造成内存泄漏。
2.可达性分析算法
当一个对象到GC Roots没有任何引用链相连时,则证明此对象是不可用的
object5,6,7对象可回收
Java中可作为GC Roots对象的可以是:
- 虚拟机栈中引用的对象
- 方法区中类静态属性引用的对象
- 方法区的常量引用的对象
- 本地方法栈中引用的对象
ps:大致为jvm内存模型中 堆中的对象和方法区或java栈或本地方法栈是否有联系
3.最终判定
- 即使在可达性分析算法中不可达的对象,也并非是“非死不可”的,这时候它们暂时处于“缓刑”阶段,要真正宣告一个对象死亡,至少要经历再次标记过程。标记的前提是对象在进行可达性分析后发现没有与GC
Roots相连接的引用链