内存回收的具体实现。
停顿时间越短就越适合需要与用户交互的程序,良好的响应速度能提升用户的体验;而高吞吐量则可以最高效率的利用CPU时间,尽快的完成程序的运算任务,主要适合在后台运算而不需要太多交互的任务。
GC停顿时间缩短是以牺牲吞吐量和新生代空间来换取的:系统把新生代调小一些,收集100MB的新生代肯定比收集1000MB的新生代快,这也直接导致垃圾收集器发生的更频繁,原来10秒收集一次,每次停顿100毫秒,现在5秒收集一次,每次停顿70毫秒,停顿时间在下降,但吞吐量也下降了。
HotSopt JVM1.6中垃圾收集器的结构图
如果2个收集器之间存在连线,说明他们可以搭配使用。
Serial收集器
新生代收集器,“stop the word”,单线程收集器。适合client,而且对于收集几十M内存来说停顿极短,尤为高效使用。不存在多线程上下文切换的浪费。
ParNew收集器
新生代收集器,是Serial收集器的多线程版本的并行收集器。但也是“stop the word”。在server上多CPU环境的首选的新生代收集器。
Parallel Scavenge收集器
新生代收集器,并行的多线程收集器。该收集器目标是提高吞吐量。也叫吞吐量优先收集器。同时支持自适应策略。
Serial Old收集器
年老代收集器,是Serial收集器的年老代版本。使单线程和标记-整理算法。同理更适用于client的单CPU单线程的模式。
Parallel Old收集器
年老代收集器,是Parallel Scavenge收集器的年老代版本。使用多线程和标记-整理算法。主要是服务端模式下和Parallel Scavenge收集器组合使用。
CMS收集器(Current Mark Sweep)
年老代收集器,是一种以获取最短回收停顿时间为目标的收集器。尤其重视服务的响应速度。基于标记-清除算法实现。由于收集完成后会产生碎片,所以要开启 -XXUseCMSCompactAtFullCollection开关参数,用于在Full GC之后,进行一次碎片整理。内存整理的时候无法并发的。
他运作分为4个阶段
1 初始标记
2 并发标记
3 重新标记
4 并发清除
他的主要有点:并发收集、低停顿
缺点:
对CPU资源非常敏感
无法处理浮动垃圾
收集结束后会产生大量的空间碎片
G1收集器(Garbage First)
与CMS算法相比,有2个显著的改进。
1 基于标记-整理算法。
2 非常精确的控制停顿
G1将整个JAVA堆(包括新生代、老年代)划分为多个固定大小的独立区域,并跟踪垃圾堆积程度,在后台维护一个优先列表,每次根据允许的收集时间,有限回收垃圾最多的区域。
附录
并行(Parallel):多线程垃圾收集器工作的时候,停止用户工作。
并发(Concurrent):用户线程和垃圾收集器同时工作。
- 大小: 50.1 KB
- 大小: 32 KB
- 大小: 35.9 KB
- 大小: 32.1 KB
- 大小: 36.5 KB
- 大小: 41.7 KB
分享到:
评论