本文主要是介绍66.G1垃圾收集器、优势与缺点、参数设置、使用场景,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
目录
- 1.`G1`概述
- 2.`G1`的优势与缺点
- 3.`G1`参数设置
- 4.`G1`使用场景
1.G1概述
-
为什么有了前面几个强大的垃圾收集器,还需要
Garbage First(G1) GC?
随着应用程序所应对的业务越来越庞大、复杂,前面几款垃圾收集器已经不能满足实际的需要,所以出现了G1。 -
G1是在延迟可控的情况下,获得尽可能高的吞吐量,所以才担当起“全功能收集器”的重任与期望。(全功能收集器的意思是它既负责新生代的垃圾回收又负责老年代的垃圾回收)
-
G1收集器将堆内存划分为很多不想关的区域(Region)(物理上可以是不连续的空间),使用不同的Region来表示Eden,S0区,S1区,老年代等等。 -
G1有计划的避免在整个Java堆中进行全区域的垃圾收集,G1会跟踪各个Region里面的垃圾堆积的价值大小(回收所获得的空间大小以及回收所需要的时间经验值),在后台维护一个优先列表,每次根据允许的收集时间,优先回收价值最大的Region。
-
G1在JDK7中正式启用,但不是默认的垃圾收集器,在JDK9中成为了默认的垃圾收集器,取代了CMS以及Parallel + Parallel Old组合。在JDK7以及JDK8中,可以使用-XX:+UseG1GC来启用。
-
G1将堆空间划分为若干个区域(Region),各个region可以是Eden区,Survivor区以及Old区等。
2.G1的优势与缺点
优势:
- 并行与并发 - 多个垃圾收集线程同时工作(并行),垃圾收集线程与用户线程交替执行(并发)。
- 分代收集 -
G1将堆空间划分为若干个区域(Region),这些区域中包含了逻辑上的年轻代和老年代。它不要求年轻代,老年代是连续的。同时,G1同时兼顾年轻代和老年代的垃圾回收,其他的垃圾收集器,要么工作在年轻代,要么工作在老年代。
- 空间整合(内存碎片整理) -
G1内存回收使用Region作为基本单位,Region之间使用的是复制算法,能够对内存空间进行整理。
- 可预测的停顿时间模型 - 可以让用户明确指定在一个长度为
M毫秒的时间片段内,消耗在垃圾收集上的时间不得超过N毫秒。
缺点:
相比于CMS,G1还不具备全方位、压倒性优势。比如,G1为了垃圾收集产生的内存占用以及程序运行时的额外执行负载都比CMS要高。
3.G1参数设置
-XX:G1HeapRegionSize 设置每个region的大小,值只能是2的n次方(1,2,4,8,16,32),范围是1MB到32MB。
-XX:MaxGCPauseMillis 设置期望达到(JVM会尽力实现,但不保证)的最大GC停顿时间,默认是200ms。 这个参数如果设置的过小,会导致一次回收的region个数减少,回收的垃圾对象减少(因为设置的垃圾线程工作的时间减少了),如果产生垃圾的速度很快,可能会导致Full GC。
-XX:ParallelGCThread 设置STW的时候并行的垃圾线程数量。
-XX:ConcGCThreads 设置用户线程与垃圾收集线程并发的时候,垃圾收集线程的线程数量
通常使用G1收集器,不需要那么多的参数配置。只需要进行下图所示的3步。其他的参数,G1会自动调节或使用默认的参数。
4.G1使用场景
更多JVM文章请访问我的JVM专栏:
https://blog.csdn.net/u011069294/category_10113093.html
这篇关于66.G1垃圾收集器、优势与缺点、参数设置、使用场景的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!