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。
相关文章推荐
- 深入理解Java虚拟机 - 垃圾收集算法与垃圾收集器
- RMI垃圾收集简介
- Java虚拟机系列(二):垃圾收集器与内存分配策略
- [课本划重点]深入理解jvm-第3章 垃圾收集器与内存分配策略(3)
- JVM笔记2_垃圾收集器与内存分配策略
- Java垃圾收集
- 垃圾收集算法
- Java 理论与实践:垃圾收集简史
- Java 2 垃圾收集机制,关于WeakReference等几种引用方式的阐述
- 3 垃圾收集器与内存分配策略
- 深入理解java虚拟机二:垃圾收集器与内存分配策略
- 垃圾收集初步
- CLR Via C#读书笔记——垃圾收集相关知识点【2011-01-20】
- Javascript手记-垃圾收集
- java垃圾收集描述
- JAVA虚拟机(JVM)和垃圾收集机制是什么
- 自动内存管理机制_垃圾收集器与内存分配策略
- 《深入理解java虚拟机》学习-第三章-垃圾收集器
- java垃圾收集的算法分析转
- 深入研究虚拟机之垃圾收集(GC)算法实现