前言
G1是JDK9默认的垃圾回收器。想要玩转高版本,高版本的垃圾回收器先了解一下!
本文简单介绍了G1,内存分配策略,GC回收方式,以及G1调优。
什么是G1?
G1(garbage—first)是JVM中的一种垃圾回收器,适用于多核、大内存的服务端,garbage-first意思是总是优先回收价值最大的区域。
-XX:+UseG1GC 开启G1垃圾收集器
-Xmx32g 设定堆内存的最大内存为32G
为什么要使用G1?
G1的出现是为了替换CMS
- G1有CMS的优点:
低延迟:G1能充分利用硬件优势(多CPU、多核)来缩短Stop-The-World,很多情况下可以通过并发的方式让程序继续执行。 - G1针对CMS的问题进行了改进:
算法优化:CMS使用的mark-sweep标记清除算法会产生内存碎片,G1使用copying算法整理内存,复制的时候完成了堆压缩,不产生内存碎片,有利于程序长时间运行,分配大对象不会因为内存空间不足而提前触发下一次GC。 - G1的新特性:
可调控GC:G1能建立可预测的停顿时间模型,设定在M毫秒的时间段内,垃圾回收时间不超过N毫秒。G1不是一个实时收集器,对gc停顿时间的设定并不绝对生效,只是保证高概率在停顿时间模型中完成gc,尽可能满足参数设定。
注: G1为什么可以建立可预测的停顿时间模型?
G1有计划地避免在整个堆中进行全区域的垃圾收集,G1通过优先列表计算各个region里面的垃圾堆积价值(回收获得的空间以及回收所需时间),每次根据允许的收集时间,优先回收价值最大的Region(Garbage-First名称的来由)。G1使用region划分内存空间和设定优先级的回收方式,保证了有限时间内能高效率的回收垃圾,保证了程序的长时间运行。
G1长什么样?
region 区
Serial GC,Parallel GC,CMS GC将整个堆按年代划分,进行分代回收。G1依然是分代垃圾回收器,G1将堆划分为2048个region(大小为1~32M,2的幂次方),每个region从属不同的年代(注意:region并不固定属于某个年代,有时候属于young,有时候属于old,根据其保存对象来决定),每个年代都是一部分region的集合。如图:
-XX:G1HeapRegionSize=16M 设置reigon区域大小,1-32M之间,划分2048个region
-XX:G1NewSizePercent=5 设置young代的堆空间占比,default:5%
-XX:NewRatio=2 设置young与old的比率,default:2
-XX:SurvivorRatio=8 设置Eden与Survivor的比率&#x