您的位置:首页 > 其它

jvm GC回收几种算法理解

2018-02-10 13:25 246 查看
对于java 开发人员jvm 并不陌生,今天我们就看一下jvm垃圾回收的几种算法。1)经典算法:引用计数法
简单理解:引用计数法通俗讲就是我们创建对象时如果有引用我们此对象时,那么我们此对象引用计数器就增加一,相反如果释放此对象引用时我们减一,以此种思想来进行我们GC回收。缺点:个人认为如果我们创建一个根对象A,如果B对A进行引用,并且B形成了一个循环引用那么如果如果B不在对A进行引用但是引用循环并没有结束,此时很难做垃圾回收(如下图)。另外计数器的加和减影响效率。


2)标记-清除算法

这种算法分为2个阶段一个是标记阶段,一个是清除阶段,标记阶段就是标记所有与根节点关联的可达的对象,未被标记的其实就变为了垃圾对象,清除:不明思议就是清除未被标记的对象。如 下图

3)标记压缩算法
这种算法是标记-清除算法的一种中间优化算法,不同的是标记-压缩算法是当我们标记完所有对象时并不急于清除未标记的对象,而是将标记对象压缩到内存一端之后清理其他内存空间。如下图;

这种算法有点,简单来说就是GC之后使用内存空间连续并且在内存前端,可用空间也是连续的,这样我们空间使用时效率更高一些。4)复制算法:

通俗的说就是jvm首先创建相同的内存空间s0,s1,s0内存中存储使用的相关对象,但我们Gc时将s0一些引用使用到的对象复制到我们s1中,将我们s0进行清除,然后内存空间互换角色。其中我们老年代对象不能通过复制算法进行对象的清理,这种算法只适合年轻代少量对象,大对象由于所占空间较大不适合存放在复制空间中,所以此类直接放入到老年代空间进行垃圾回收处理。

从上图我们可以看到这种算法消耗内存严重。什么叫GC停顿-stop-the-world 通俗讲就是我们应用不断的产生新生代对象,而我们的GC并不能真正的GC,这种情况就会导致我们GC停顿,影响就是我们系统无响应或导致其他问题。在HA系统中,我们有主,备机两台机器,正常我们主机工作运行,而备机是不工作的,如果主机停顿,那么备机可能唤醒进行工作,而此时主机用恢复了工作,此时主,备机同时工作,这样很危险比如数据不同步,服务无法使用等。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: