垃圾回收算法介绍


垃圾回收算法java


常见的垃圾回收算法算法

1.标记-清除算法安全

2.复制算法微信

3.标记-整理算法数据结构

4.分代垃圾收集算法jvm



标记-清除算法flex

    标记-清除就是JVM运行过程当中对java对象所在的内存区域进行标记,因为java对象是分散在整个内存中的,有些对象是能够回收的,有些却不能够,咱们标记完待回收的内存,以后就会对这这些内存进行一次回收,这样致使的一个问题就是回收以后内存空间零散的分布在整个堆内存中,这些不连续的内存空间会致使后期一些大对象分配不进去。优化


复制算法
url




    复制算法就能够解决掉上面清除以后出现大量不连续内存空间的问题。复制算法将整个内存空间分红大小相等的两块区域,每次使用其中一块内存,当该区域内存标记清除以后,将存活的对象复制到另外一块内存中,这样能够又能够腾出一块连续的内存空间,每次分配内存均可以移动堆顶的指针按顺序在堆中分配。spa

注意这种算法会比较浪费堆内存空间,每次的实际可用空间缩减一半,代价仍是很高的。可是如今的商用虚拟机大部分采用这中算法来进行垃圾回收,不过进行了优化改进,因为jvm运行过程当中,大部分的对象存活的时间是很短的,这类对象的生命周期通常的伴随着线程的启动和死亡就基本上没有用了。因此后来对jvm内存分区进行了从新分配,出现了新生代和老年代,新生代中又将内存区域分为Eden区和Survivor区,这样大部分对象建立首先是在Eden中分配,随后每触发一次YGC就能够将Eden区还存活的对象移动到Survivor中,当达到必定的GC年龄能够复制到老年代,还有就是老年代是做为年轻代内存分配的一个担保,若是年轻代分配不了时,会直接经过分配担保机制进入老年代。这里年轻代的Survivor其实还区分为From Survivor和To Survivor两个,这里的复制规则后边详细讨论。


标记整理算法

        上面的复制算法能够看出须要将内存进行分块,并且是一分为二,固然咱们知道年轻代的并无彻底一分二,将形成有一半的内存不能直接分配对象,因此上面年轻代的大小占堆很小部分,通常是1/4或者1/3。这样老年代能够是年轻代的担保,可是老年代的回收使用一分为二的方式进行内存分配,就没有其余内存进行担保了。因此复制算法不太适合老年代的内存回收。因此老年代的回收已经再也不适合复制算法,因而就出现了一种标记-整理的算法,这里相似标记清除,只不过整理的过程须要将存活的对象往堆的一端移动来保证清除以后内存的连续性。

备注:这里说到年轻代是采用Eden和Survivor的方式,比例也是能够自由实现的,并且默认Eden/survivor通常的是8:1,并无彻底是一分为二,可是仍是能够看出有复制分块的思想


分代收集算法

    上面说的这些算法,如今的一些商用虚拟机中都有用到,结合上面各个算法优缺点,jvm将内存空间进行分代处理,分为年轻代和老年代,还有老版本的永久代,正对不一样的分代的区域采用不一样类型的回收算法,因此年轻代,上面讲述了能够采用复制算法,将对象在Eden中,复制到survivor中再转向老年代,老年代则经过标记-整理保证堆空间的连续性。对于咱们平时用的Hotspot虚拟机回收是经过不一样的垃圾回收器进行回收,垃圾回收器就会用到上面所说的几种回收算法。


Stop The Word

    这里主要说一下Stop The World,我以为这是java虚拟机的一个垃圾回收特点吧。STW就是jvm回收垃圾的时候会停掉应用线程,这么说来应用在运行的时候会出现短暂的停顿,咱们称之为Stop The World,为何jvm须要Stop the World以前就讲过java虚拟机如何判断对象的存活和死亡,是采用Root Object可达性分析的方式,那么程序运行过程当中栈中的变量表是时刻变更的,因此jvm须要获取某一时刻的堆栈中对象的快照,要想获取某些时刻,就必须保持一个短暂的停顿来完成冻结,肯定根对象,而后就能够完成引用的可达性分析。

安全点和安全区

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

        了解了这些垃圾回收算法以后,咱们就能够去分析各个时期,各个分区垃圾回收器的特色。下一篇咱们会介绍hotspot虚拟机垃圾回收器相关的知识。


微信公众号:MyClass社区

若有问题或建议,请公众号留言。

喜欢请关注

本文分享自微信公众号 - MyClass社区(MyClass_ZZ)。
若有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一块儿分享。

相关文章
相关标签/搜索