概述
首先,我们要知道,java内存运行区的程序计数器、虚拟机栈、本地方法栈这三个区随着线程生、随线程而死;垃圾回收机制主要集中在java堆和方法区。
对象是否存活
引用计数法
引用计数法是一个颇为古老的方式,原因它有致命的缺点。先不说缺点,咱们看一看它的思路。
它的做法是为每个对象添加一个引用计数器,用来统计指向该对象的引用个数。一旦某个对象的引用计数器为0,则说明该对象已经死亡,便可以被回收了。
它的具体实现是这样子的:如果有一个引用,被赋值为某一对象,那么将该对象的引用计数器+1。如果一个指向某一对象的引用,被赋值为其他值,那么将该对象的引用计数器 -1。
对于引用计数法来说,除了需要额外的空间来存储计数器,以及繁琐的更新计数器以外;引用计数法还有一个重大的漏洞:无法处理循环引用。
假设对象 a 与 b 相互引用,除此之外没有其他引用指向 a 或者 b。在这种情况下,a 和 b 实际上已经死了,但由于它们的引用计数器皆不为 0,在引用计数法的心中,这两个对象还活着。因此,这种情况下就造成了内存泄露。