java虚拟机---垃圾收集器

版权声明:本文为博主原创文章,未经博主允许不得转载。转载请注明来源 https://blog.csdn.net/Q176782/article/details/72875862
如果说收集算法是内存回收的方法论,那么垃圾收集器就是内存回收的具体实现


1.serial收集器:

这是一个单线程的收集器.使用一个收集线程去完成;垃圾收集工作,在垃圾回收时,必须暂停其他所有的工作线程,直到它收集结束.Serial收集器由于没有线程交互的开销,专心做垃圾收集也就拥有获得最高的单线程收集效率。


2.ParNew 收集器

它是serial收集器的多线程版,基本和serial收集器差不多.虽说没有太多的创新,但却是许多运行在Server模式下的虚拟机中首先的新生代收集器.这是因为只有serial收集器和ParNew能和CMS收集器(下文有介绍)配合工作.


3.Parallel Scavenge收集器

也被称为"吞吐量优先"收集器

Parallel Old收集器的特点是关注点和其他收集器不同.CMS等收集器关注的是尽可能的缩短垃圾收集时用户线程的停顿时间.而Parallel Old收集器关注的是吞吐量

停顿时间影响的是用户的体验程度;吞吐量影响cpu的使用效率

4.Serial Old收集器

serial Old 是serial收集器的老年代版本.也是一个单线程收集器


5.Parallel Old收集器

Parallel Old是Parallel Scavenge的老年代版本.在注重吞吐量以及cpu资源敏感的场合,都可以优先考虑Parallel两个收集器


6.CMS收集器

它是一种以获取最短回收停顿时间为目标的收集器.某些应用重视服务的响应速度,希望系统停顿时间最短,CMS收集器非常符合.它是基于标记-清除算法实现的收集器.
CMS运作过程较为复杂,可分为4个步骤:
①.初始标记(CMS initial mark)
②.并发标记(CMS concurrenr mark)
③.重新标记(CMS remark)
④.并发清除(CMS concurrent sweep)

总体上说,CMS收集器的内存回收过程是与用户线程一起并发执行的.

CMS有三个明显的缺点:
①.对cpu资源非常敏感.在并发阶段会占用一部分线程,所以导致应用程序变慢,总吞吐量降低
②.无法处理浮动垃圾.在执行并发清除时,既然是并发,随着程序运行自然有垃圾产生,这些垃圾CMS无法清除,只能等到下次了.此时如果没有足够的内存来满足程序需要,就会触发Serial Old回收老年代,速度超慢,这样反而性能降低
③.既然是标记-清除算法,过多的空间碎片就不能避免


7.G1收集器(Garbage First)

(Oracle JDK 7 update 4 及以上版本中得到完全支持)

它是目前最牛逼的收集器.它是面向服务器应用的垃圾收集器.预计取代CMS收集器.其目标是在实现高吞吐量的同时,尽可能的满足垃圾收集暂停时间的要求.


G1收集器基于“标记-整理”算法实现,也就是说不会产生内存碎片。还有一个特点,之前的收集器进行收集的范围都是整个新生代或老年代,而G1将整个Java堆(包括新生代,老年代)。其将Java堆空间划分为一些大小相等的区域(region),每个区域都是虚拟机中的一段连续内存空间。G1通过执行并发的全局标记来确定整个Java堆空间中存活的对象。标记阶段完成后,G1就知道哪些区域基本上是空闲的。在回收内存时优先回收这些区域,这样通常都会回收相当数量的内存。这就是为什么它叫做Garbage-First的原因


G1在执行一些Java堆空间中的全区域操作(如:全局标记)时是和应用程序线程并发进行的,因此减少了Java堆空间的中断比例。(译者注:可简单理解为减少了Stop-the-World的时间比例)。
`  



总结:


回收新生代垃圾的收集器有:Serial,Parallel Scavenge,ParNew 
回收老年代垃圾的收集器有:Serial Old,Parallel Old,CMS
回收整个java堆的收集器: G1






参考文献:http://blog.csdn.net/java2000_wl/article/details/8030172

猜你喜欢

转载自blog.csdn.net/Q176782/article/details/72875862