目录
分析无效对象
程序计数器、虚拟机栈、本地方法栈随线程而生随线程而灭,栈帧随着方法的开始而入栈,随着方法的结束而出栈。这几个区域的内存分配和回收都具有确定性,在这几个区域内不需要过多考虑回收的问题,因为方法结束或者线程结束时,内存自然就跟随着回收了。而对于Java堆和方法区,只在程序运行期间才能知道会创建哪些对象,内存的分配和回收都是动态的,垃圾收集器关注的也是这部分内存。如何判定一个对象是否存活呢,若一个对象不被任何对象或变量引用,那么它就是无效对象,需要被回收。
引用计数法
在对象头维护着一个counter计数器,对象被引用一次则计数器 +1,若引用失效则计数器 -1。当计数器为0时,就认为该对象无效了。引用计数算法的实现简单,判定效率也很高,在大部分情况下它都是一个不错的算法。但是主流的Java虚拟机里没有选用引用计数算法来管理内存,主要是因为它很难解决对象之间循环引用的问题(虽然循环引用的问题可通过Recycler算法解决,但是在多线程环境下,引用计数变更也要进行昂贵的同步操作性能较低早期的编程语言会采用此算法。)。比如对象objA和objB都有字段instance,令objA.instance = objB并且objB.instance = objA,由于它们互相引用着对方,导致它们的引用计数都不为 0,于是引用计数算法无法通知GC收集器回收它们。