今天来总结一下最近学习到的JVM垃圾收集算法和垃圾收集器。原来觉得这部分知识,对于一个Java程序员的用处不大,但是若是你的运营Web项目,出现了性能问题,那么这部分知识能够帮助你从运维的角度来优化你的项目。
首先,先讲一下JVM的垃圾收集算法,由于这是学习垃圾收集器的前堤。各类垃圾收集器也都是基于这些算法来实现的。
1、JVM垃圾收集算法
JVM垃圾收集算法有四种:标记-清除算法、复制算法、标记-整理算法、分代收集算法
标记-清除算法:
该算法如同它的名字同样,分为两个阶段:标记、清除。首先标记出全部须要回收的对象,而后,统一清除这些被标记的对象。该算法的缺点是:一、效率不 高;二、产生大量不连续的内存碎片,致使有大量内存剩余的状况下,因为,没有连续的空间来存放较大的对象,从而触发了另外一次垃圾收集动做。
复制算法:
因为标记-清除算法的效率不高,从而提出了复制算法。复制算法将可用的内存分红两样大小的两块,每次只使用其中一块内存。当这块内存用完以后,就把还存活 的对象复制到另一块上面,而后,把这块清空。复制算法克服了标记-清除算法的两个缺点,可是太浪费内存,至关于内存空间减少了一半。
随着时间的积累,如今使用的复制算法的虚拟机,再也不是把内存分为1:1的两块。由于98%的对象是寿命很短的,建立以后,很快就被回收了,存活下来的只有 2%,因此,用来存储存活对象的内存区,能够小一些。如今的商业虚拟机是把可用内存分为一个较大的Eden空间和两个较小的Survivor空间,每次使 用Eden和其中的一块Survivor。当回收时,把Eden和Survivor中的存活对象一次复制到另外一块Survivor内存区上,而后把 Eden和刚才用过的Survivor空间清空。HotSpot虚拟机默认Eden和Survivor的大小比例是8:1,这样,每次新产生的对象可使 用90%的内存空间。
标记-整理算法
从名字能够看出,该算法是对“标记-清除”算法的改进升级版。一样的该算法分为两个阶段:标记、整理。标记阶段同“标记-清除”算法。整理阶段,不是直接 对标记对象进行清理,而是让全部存活的对象都移动到一端,而后,直接把边界之外的内存清空。这就解决了“标记-清除”算法会形成大量不连续内存碎片的问 题。
分代收集算法
分代收集算法是根据对象的存活周期的不一样,将内存划分为几块。当前的商业虚拟机的垃圾收集都采用了该算法。通常把Java堆分红新生代(年轻代)和老年代 (年老代)。这样就能够根据各年代中对象的存活周期来选择最合适的收集算法了。新生代,因为只有少许的对象能存活下来,因此选用“复制算法”,只须要付出 少许存活对象的复制成本。老年代,因为对象的存活率高,没有额外的空间分担,就必须使用“标记-清除”或“标记-整理”算法。
2、JVM垃圾收集器
因为内存中的对象,是按存活周期存放在不一样的内存块中的,因此,咱们选择不一样的算法来针对不一样的内存块进行垃圾收集。从而,对于,不一样的内存块,咱们须要有不一样的垃圾收集器。
新生代的垃圾收集器有:Serial收集器、ParNew收集器、Parallel Scavenge收集器
老年代的垃圾收集器有:Serial Old收集器、Parallel Old收集器、CMS收集器、G1收集器
下面咱们来分别介绍一下这些垃圾收集器程序员
Serial收集器/Serial Old收集器
Serial收集器/Serial Old收集器,是单线程的,使用“复制”算法。当它工做时,必须暂停其它全部工做线程。特色:简单而高效。对于运行在Client模式下的虚拟机来讲是一个很好的选择。算法
ParNew收集器
ParNew收集器,是Serial收集器的多线程版。是运行在Server模式下的虚拟机中首选的新生代收集器。除了Serial收集器外,目前只有它能与CMS收集器配合工做。多线程
Parallel Scavenge收集器/Parallel Old收集器
Parallel Scavenge收集器,也是使用“复制”算法的、并行的多线程收集器。这些都和ParNew收集器同样。但它关注的是吞吐量(CPU用于运行用户代码的 时间与CPU总消耗时间的比值),而其它收集器(Serial/Serial Old、ParNew、CMS)关注的是垃圾收集时用户线程的停顿时间。
Parallel Old收集器是Parallel Scavenge收集器的老年代版本。
CMS收集器
CMS(Concurrent Mark Sweep)收集器是一种以获取最短回收停顿时间为目标的收集器,使用“标记-清除”算法。
CMS收集器分4个步骤进行垃圾收集工做:
一、初始标记 二、并发标记 三、从新标记 四、并发清除
其中“初始标记”、“从新标记”是须要暂停其它全部工做线程的。
G1收集器
G1(Garbage First)收集器,基于“标记-整理”算法,能够很是精确地控制停顿。并发
3、总结运维