您的位置:首页 > 其它

6.垃圾收集器

2018-04-01 18:50 176 查看

       上图展示了7种用于不同分代的垃圾收集器,如果两个收集器之间存在连线,这说明它们可以搭配使用。虚拟机所处的区域,则表示它是属于新生代收集器还是老年代收集器。

Serial收集器

       这是一个单线程的垃圾收集器。但需要说明的是,这个“单线程”并不仅仅指它只会使用一个线程去完成垃圾回收工作,更重要的是它在进行垃圾回收的时候,必须暂停其他所有的工作线程,直至它收集结束。
       垃圾回收工作时虚拟机在后台自动发起和自动完成的,在用户不可见的情况下把用户正常工作的线程全部暂停。
       这对很多应用来说是不可接受的,试想,运行1小时,停顿1分钟,这的确是难以接受。


       虚拟机开发团队一直在为消除或者减少工作线程因内存回收而导致停顿而努力,垃圾收集器的不断发展,用户线程的停顿时间在不断地缩短,但仍然没有办法完全消除。       Serial收集器仍然是Client模式下的默认新生代收集器,它有优于其他收集器的地方:简单而高效(与其他收集器的单线程相比)。       特别是对于单个CPU的环境来说,Serial收集器由于没有线程交互的开销,专心做垃圾收集自然可以获得最高的单线程收集效率。
       在桌面应用场景中,分配给虚拟机管理的内存一般不会很大,收集几十到一两百兆的新生代,停顿时间完全可以控制在几十毫秒最多一百多毫秒以内,只有不频繁的发生,这停顿是可以接受的。

ParNew收集器

       ParNew收集器就是Serial的多线程版本,除了使用多条线程去进行垃圾回收之外,其余行为包括Serial收集器可用的控制参数,收集算法,GC停顿,对象分配规则,回收策略等都与Serial一样。

       ParNew是运行在Server模式下的虚拟机首选的新生代收集器,最大的原因是,目前除了Serial收集器外,只有它能与CMS收集器配合工作。       ParNew收集器在单CPU的环境绝对不会比Serial收集器效果更好,由于存在线程交互开销。它默认开启的收集线程数与CPU的数量相同。可以用-XX:ParallelGCThreads参数来限制垃圾收集的线程数量。

Parallel Scavenge收集器

       这是一个新生代的垃圾收集器,使用的是复制算法(当然,商业虚拟机的新生代一般都是复制算法),又是并行的多线程收集器。
       它与其他收集器的不同点在于,例如CMS等收集器的关注点是尽可能地缩短垃圾收集时用户线程的停顿时间,而它的目标则是达到一个可控制的吞吐量。
       吞吐量是指,CPU用于运行用户代码的时间与CPU总消耗时间的比值,即吞吐量 = 运行用户代码时间/(运行用户代码时间+垃圾收集时间)。
       停顿时间越短就越适合需要与用户交互的程序,良好的响应速度能提升用户体验,而高吞吐量则可以高效率地利用CPU时间,尽快地完成程序的运算任务,主要适合在后台计算而不需要太多的交互的任务。
       它提供了两个参数用于精确控制吞吐量,分别是控制最大垃圾收集停顿时间的-XX:MaxGCPauseMillis和直接设置吞吐量大学的-XX:GCTimeRatio。
        
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  垃圾收集器 JVM