垃圾回收算法有哪些?

2018-09-1410:54:00数据结构与算法Comments2,708 views1字数 1873阅读模式

垃圾回收算法文章源自菜鸟学院-https://www.cainiaoxueyuan.com/suanfa/4628.html

常见的垃圾回收算法文章源自菜鸟学院-https://www.cainiaoxueyuan.com/suanfa/4628.html

1.标记-清除算法文章源自菜鸟学院-https://www.cainiaoxueyuan.com/suanfa/4628.html

2.复制算法文章源自菜鸟学院-https://www.cainiaoxueyuan.com/suanfa/4628.html

3.标记-整理算法文章源自菜鸟学院-https://www.cainiaoxueyuan.com/suanfa/4628.html

4.分代垃圾收集算法文章源自菜鸟学院-https://www.cainiaoxueyuan.com/suanfa/4628.html

标记-清除算法
标记-清除就是JVM运行过程中对java对象所在的内存区域进行标记,由于java对象是分散在整个内存中的,有些对象是可以回收的,有些却不可以,我们标记完待回收的内存,之后就会对这这些内存进行一次回收,这样导致的一个问题就是回收之后内存空间零散的分布在整个堆内存中,这些不连续的内存空间会导致后期一些大对象分配不进去。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/suanfa/4628.html

复制算法文章源自菜鸟学院-https://www.cainiaoxueyuan.com/suanfa/4628.html

复制算法就可以解决掉上面清除之后出现大量不连续内存空间的问题。复制算法将整个内存空间分成大小相等的两块区域,每次使用其中一块内存,当该区域内存标记清除之后,将存活的对象复制到另一块内存中,这样可以又可以腾出一块连续的内存空间,每次分配内存都可以移动堆顶的指针按顺序在堆中分配。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/suanfa/4628.html

注意:这种算法会比较浪费堆内存空间,每次的实际可用空间缩减一半,代价还是很高的。但是现在的商用虚拟机大部分采用这中算法来进行垃圾回收,不过进行了优化改进,由于jvm运行过程中,大部分的对象存活的时间是很短的,这类对象的生命周期一般的伴随着线程的启动和死亡就基本上没有用了。所以后来对jvm内存分区进行了重新分配,出现了新生代和老年代,新生代中又将内存区域分为Eden区和Survivor区,这样大部分对象创建首先是在Eden中分配,随后每触发一次YGC就可以将Eden区还存活的对象移动到Survivor中,当达到一定的GC年龄可以复制到老年代,还有就是老年代是作为年轻代内存分配的一个担保,如果年轻代分配不了时,会直接通过分配担保机制进入老年代。这里年轻代的Survivor其实还区分为From Survivor和To Survivor两个,这里的复制规则后边详细讨论。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/suanfa/4628.html

标记整理算法
上面的复制算法可以看出需要将内存进行分块,而且是一分为二,当然我们知道年轻代的并没有完全一分二,将造成有一半的内存不能直接分配对象,所以上面年轻代的大小占堆很小部分,一般是1/4或者1/3。这样老年代可以是年轻代的担保,但是老年代的回收使用一分为二的方式进行内存分配,就没有其他内存进行担保了。所以复制算法不太适合老年代的内存回收。所以老年代的回收已经不再适合复制算法,于是就出现了一种标记-整理的算法,这里类似标记清除,只不过整理的过程需要将存活的对象往堆的一端移动来保证清除之后内存的连续性。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/suanfa/4628.html

备注:这里说到年轻代是采用Eden和Survivor的方式,比例也是可以自由实现的,而且默认Eden/survivor一般的是8:1,并没有完全是一分为二,但是还是可以看出有复制分块的思想文章源自菜鸟学院-https://www.cainiaoxueyuan.com/suanfa/4628.html

分代收集算法
上面说的这些算法,现在的一些商用虚拟机中都有用到,结合上面各个算法优缺点,jvm将内存空间进行分代处理,分为年轻代和老年代,还有老版本的永久代,正对不同的分代的区域采用不同类型的回收算法,所以年轻代,上面讲述了可以采用复制算法,将对象在Eden中,复制到survivor中再转向老年代,老年代则通过标记-整理保证堆空间的连续性。对于我们平时用的Hotspot虚拟机回收是通过不同的垃圾回收器进行回收,垃圾回收器就会用到上面所说的几种回收算法。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/suanfa/4628.html

“Stop The Word”
这里主要说一下Stop The World,我觉得这是java虚拟机的一个垃圾回收特色吧。STW就是jvm回收垃圾的时候会停掉应用线程,这么说来应用在运行的时候会出现短暂的停顿,我们称之为Stop The World,为什么jvm需要Stop the World?之前就讲过java虚拟机如何判断对象的存活和死亡,是采用Root Object可达性分析的方式,那么程序运行过程中栈中的变量表是时刻变动的,所以jvm需要获取某一时刻的堆栈中对象的快照,要想获取某些时刻,就必须保持一个短暂的停顿来完成冻结,确定根对象,然后就可以完成引用的可达性分析。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/suanfa/4628.html

 安全点和安全区文章源自菜鸟学院-https://www.cainiaoxueyuan.com/suanfa/4628.html

首先hotspot jvm中会有一种OopMap的数据结构精准的记录对象的引用,不是每次都是检查一遍堆栈的引用对象位置,当STW的时候,jvm就会从这里获取说有的引用进行分析。当然jvm也不是随便的去暂停应用的所有线程,也是需要程序达到以这个安全点或者安全区域,这些时刻或者时间段,jvm才会去执行STW,将线程挂起,这个安全点在jvm也是有标记的,线程运行过程中会轮询安全点标识,当所有线程都得到通知到达一个安全点进行挂起,jvm才会去执行相关的垃圾回收。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/suanfa/4628.html

了解了这些垃圾回收算法之后,我们就可以去分析各个时期,各个分区垃圾回收器的特点。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/suanfa/4628.html

  • 本站内容整理自互联网,仅提供信息存储空间服务,以方便学习之用。如对文章、图片、字体等版权有疑问,请在下方留言,管理员看到后,将第一时间进行处理。
  • 转载请务必保留本文链接:https://www.cainiaoxueyuan.com/suanfa/4628.html

Comment

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定