Java垃圾回收与算法

我们知道Java在运行时内存分为了五个部分:程序计数器、虚拟机栈、本地方法栈、堆、方法区。其中程序计数器、虚拟机栈、本地方法栈所占用的内存是不需要垃圾收集的,这三个区域的内存随着线程生,随着线程死,我们需要关注的其实只有堆和方法区这两块内存的垃圾收集。

下面从这几点说一下JVM GC

GC要做什么

如何判断对象已经死亡

垃圾回收算法有哪些

垃圾收集器

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(); } }

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zwfdzz.html