*对之前的一片博客重新整理
1 哪些内存需要回收?
Java运行时数据区包括:程序计数器、虚拟机栈、本地方法栈、Java堆和方法区。这里面程序计数器、虚拟机栈和本地方法栈是线程私有的,当线程结束或者方法退出时其内存自然会被回收。所以Java的垃圾回收机制主要关注的是两部分:Java堆和方法区。JVM规范并没有强制要求对方法区进行GC,其实方法区保存的都是类信息、静态变量、常量等,并不太需要GC,所以GC主要还是关注Java堆。
2 如何确定一个对象需要回收?
判断一个对象是不是需要回收,有两种方法:
2.1 引用计数法
给对象添加一个引用计数器,每当有一个地方引用它时,计数器的值就加一;当引用失效时,计数器的值减一;任何时刻计数器的值为0的对象就是不可能再被使用的。
引用计数法实现简单,判定效率也很高,在大部分情况下是一个不错的算法。但主流的Java虚拟机都没有使用引用计数法来管理内存,其中主要的原因是:它很难解决对象之间互相引用的问题。比如对象A和B都有instance字段,然后objA.instance=B,objB.instance=A。这里构成了一个循环引用,如果使用引用计数法的话这两个对象永远不会被回收,即使实际上这两个对象都不可能被访问到了。
2.2 可达性分析法
通过一系列的称