我是
方圆,简单入入JVM的门儿
文章目录
1. GC的作用范围
2. 四种GC算法
-
引用计数算法
对象创建的时候,就给对象绑定一个计数器。每当有一个引用指向该对象时,计数器加一;每当有引用消除时,计数器减一。在没有引用,即计数器为0时,这个对象被垃圾回收。(JVM的实现一般不采用这种算法,而是使用标记清除算法)
-
优点:比较简单; -
缺点:无法解决对象循环引用的问题;需要占用额外空间
-
复制算法
该算法应用于两个幸存区中。每次只占用其中一个幸存区,当这一幸存区(From)中满时,会进行一次MinorGC,将存活下来的对象复制到另一个空的幸存区(to)中,然后之前的幸存区被清空,称为to,而另一个由空变为非空,称为From
-
优点:不产生内存碎片 -
缺点:有一部分内存浪费(to区)
-
标记清除算法
这个算法分为如下两个阶段,标记阶段:遍历所有的GC Roots,并将所有的存活对象进行标记;清除阶段:将遍历堆中所有的对象,将没有被标记的对象清除。
-
优点:相比于引用计数算法,开销更小 -
缺点:算法复杂度较高,效率比较低;没有移动对象,这种方式清理出的内存不是连续的
-
标记整理算法
标记整理算法是标记清除算法的改进版。它们在标记阶段做的工作是相同的,只不过在第二个阶段,该算法并没有直接对死亡的对象进行清理,而是对所有存活的对象进行整理,放到一处存储空间,然后再把剩下的死亡对象全部清除。
-
优点:不产生碎片空间 -
缺点:若存活的对象很多,则效率很低