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