亲宝软件园·资讯

展开

JVM中四种GC算法 JVM中四种GC算法案例详解

rocketeerli 人气:0
想了解JVM中四种GC算法案例详解的相关内容吗,rocketeerli在本文为您仔细讲解JVM中四种GC算法的相关知识和一些Code实例,欢迎阅读和指正,我们先划重点:JVM四种GC算法,JVMGC算法,下面大家一起来学习吧。

介绍

程序在运行过程中,会产生大量的内存垃圾(一些没有引用指向的内存对象都属于内存垃圾,因为这些对象已经无法访问,程序用不了它们了,对程序而言它们已经死亡),为了确保程序运行时的性能,java虚拟机在程序运行的过程中不断地进行自动的垃圾回收(GC)。关于 JVM 的 GC 算法主要有下面四种:

引用计数算法(Reference counting)

算法思想:

每个对象在创建的时候,就给这个对象绑定一个计数器。每当有一个引用指向该对象时,计数器加一;每当有一个指向它的引用被删除时,计数器减一。这样,当没有引用指向该对象时,该对象死亡,计数器为0,这时就应该对这个对象进行垃圾回收操作。

核心思想:

为每个对象额外存储一个计数器 RC ,根据 RC 的值来判断对象是否死亡,从而判断是否执行 GC 操作。

优点:

缺点:

例子如图:

初始状态:

初始状态

改变引用后:

这里写图片描述

标记–清除算法(Mark-Sweep)

算法思想:

为每个对象存储一个标记位,记录对象的状态(活着或是死亡)。分为两个阶段,一个是标记阶段,这个阶段内,为每个对象更新标记位,检查对象是否死亡;第二个阶段是清除阶段,该阶段对死亡的对象进行清除,执行 GC 操作。

优点

缺点

例子如图

这个图中,圆圈内灰色的对象就是已经死亡的对象,被标记为死亡,等待清除。

这里写图片描述

标记–整理算法

算法思想

标记-整理法是标记-清除法的一个改进版。同样,在标记阶段,该算法也将所有对象标记为存活和死亡两种状态;不同的是,在第二个阶段,该算法并没有直接对死亡的对象进行清理,而是将所有存活的对象整理一下,放到另一处空间,然后把剩下的所有对象全部清除。这样就达到了标记-整理的目的。

优点

缺点

例子

如图:

这里写图片描述

上面是标记阶段,下面是整理之后的状态。可以看到,该算法不会产生大量碎片内存空间。

复制算法

算法思想

该算法将内存平均分成两部分,然后每次只使用其中的一部分,当这部分内存满的时候,将内存中所有存活的对象复制到另一个内存中,然后将之前的内存清空,只使用这部分内存,循环下去。

注意:

这个算法与标记-整理算法的区别在于,该算法不是在同一个区域复制,而是将所有存活的对象复制到另一个区域内。

优点

缺点

总结

不同算法有不同的优点和缺点,除了引用计数法不常用外,其他三种算法在现在的java虚拟机上也是很常见的,间接说明了这几个经典算法还是有其适用性的。

理解 JVM 的 GC 算法能够帮助我们更好地理解java的垃圾回收机制,例如,在 JVM 的年轻代使用的是复制算法来进行垃圾回收(由于其中的存活对象比例较小);而在老年代,使用的却是标记-清除法或标记-整理法(由于每次回收都只回收少量对象)

加载全部内容

相关教程
猜你喜欢
用户评论