VB.net 2010 视频教程 VB.net 2010 视频教程 python基础视频教程
SQL Server 2008 视频教程 c#入门经典教程 Visual Basic从门到精通视频教程
当前位置:
首页 > 编程开发 > Java教程 >
  • 关于java垃圾收集器的概述(二)

关于java垃圾收集器的概述(二)

java虚拟机对垃圾收集器应该如何实现并没有规定,因此不同版本的虚拟机提供的垃圾收集器可能会有差异,但是它会提供参数给用户让用户根据自己的特点去组合各个年代使用的收集器。

现在我们以HOTSpot虚拟机为例

这个虚拟机包含有7种作用于不同分代的收集器:Serial、ParNew、Parallel Scavenge、Serial Old、Parallel Old、CMS、G1;我们给他们做一个划分

新生代收集器:Serial、ParNew、Parallel Scavenge;

老年代收集器:Serial Old、Parallel Old、CMS;

整堆收集器:G1;

如果两个收集器之间存在连线,就说明它们可以搭配使用Serial/Serial Old、Serial/CMS、ParNew/Serial Old、ParNew/CMS、Parallel Scavenge/Serial Old、Parallel Scanvenge/Parallel Old、G1;其中Serial Old作为CMS出现“Concurrent Mode Failure”失败后的后备预案。

新生代收集器

Serial收集器

serial收集器是最基本、发展历史最久的收集器。曾经是新生代收集器种的唯一选择,使用复制算法。这个收集器是一个单线程的收集器,这个意义并不是说他只会使用一个CPU或者一条收集线程去完成垃圾收集工作,而是它使用并行的模式,在它进行垃圾收集这项工作时,必须暂停其他所有的线程,直到它收集结束。由虚拟机在后台自动发起和自动完成的将所有工作线程暂停也就是“STOP The World”。他在用户不可见的情况下将用户所有工作线程暂停。这项机制对很多应用来说显得不合理。Serial收集器依然是虚拟机运行在Client模式下的默认新生代收集器。它有着优于其他收集器的地方:简单而高效(与其他收集器的单线程比),对于限定单个CPU的环境来说,Serial收集器由于没有线程交互的开销,专心做垃圾收集自然可以获得最高的单线程收集效率。所以,Serial收集器对于运行在Client模式下的虚拟机来说是一个很好的选择。

ParNew收集器

ParNew收集器就是Serial收集器的多线程版本,使用复制算法,除了使用多线程进行垃圾收集之外,其余都与Serial收集器一样,但它确实许多运行在server模式下的虚拟机中首选的收集器,因为只有它才能与CMS收集器进行配合工作,并不是性能上的差异。PerNew收集器在单CPU中的可能不会比Serial收集器的效率好,但是随着CPU 数量的增加,它默认开启的收集线程与CPU 数量一致。

Parallel Scanvenge收集器

Parallel Scavenge收集器是一个新生代收集器,它也是使用复制算法的收集器,又是并行的多线程收集器。Parallel Scavenge收集器的目标是达到一个可控制的吞吐量。所谓吞吐量就是CPU用于运行代码的时间和CPU总消耗时间的比值,即吞吐量=运行用户代码时间/总运行时间(运行用户代码时间+垃圾收集时间)。停顿时间越短,用户与程序之间的交互越顺畅,良好的响应速度能够提升交互的体验感,而高吞吐量可以高效利用CPU时间,对用户的请求级士响应,能够尽快完成程序的运算,此收集器适用于后台有大量运算线程,不需要大量交互的场景。Parallel Scanvenge收集器提供了两个参数用于精确控制吞吐量,分别是控制最大垃圾收集停顿时间:MaxGCPauseMillis参数,直接设置吞吐量大小的:GCTimeRatio参数。

MaxGCPauseMillis参数允许的是一个大于0的毫秒数,收集器将尽可能的保证内存回收花费的时间不超过设定值。肯定会以为只要将垃圾收集的时间设置小一点,程序就能运行的更快,但是事实就是收集时间变短了,但是收集的次数变得频繁,导致吞吐量的效率还是不高。GC停顿时间变短是以牺牲吞吐量以及新生代空间换来的。

GCTimeRatio参数的值应当是一个大于0且小于100的整数,这是垃圾收集时间占总运行时间的比率。由于与吞吐量关系密切,Parallel Scavenge收集器也经常称为“吞吐量优先”收集器。

 

 出  处:https://www.cnblogs.com/gyzaoliao/p/14530822.html


相关教程