我们知道Java在运行时内存分为了五个部分:程序计数器、虚拟机栈、本地方法栈、堆、方法区。其中程序计数器、虚拟机栈、本地方法栈所占用的内存是不需要垃圾收集的,这三个区域的内存随着线程生,随着线程死,我们需要关注的其实只有堆和方法区这两块内存的垃圾收集。
下面从这几点说一下JVM GCGC要做什么
如何判断对象已经死亡
垃圾回收算法有哪些
垃圾收集器
GC具体做了什么哪些内存需要回收
什么时候回收
怎么回收
如何判断对象已经死亡: 1.引用计数法:在Java中,引用和对象是关联的,如果要操作对象,则必须用引用进行,因此,可以通过引用计数来判断对象是否可以回收。如果该对象被引用,计数器加1,不引用减1,如果计数器等于0,我们就认为没有引用指向该对象,可以将该对象回收,
它的不足之处就是不能解决循环引用,如下面的例子,实际上这两个对象已经不可能再被访问,但是它们因为互相引用着对方,导致它们的引用计数都不为0,于是引用计数算法无法通知GC收集器回收它们。
public class TestCycleReference { private Object obj = null; private static final int _size = 1024 * 1024; public static void main(String[] args) { TestCycleReference t1 = new TestCycleReference(); TestCycleReference t2 = new TestCycleReference(); t1.obj = t2; t2.obj = t1; t1 = null; t2 = null; System.gc(); } }