前言
冷冷的,要多穿衣服别感冒才行!最近太忙了,没来得及学习~
正文
G1参数说明:
使用 G1 收集器
-XX:+UseG1GC
指定 GC 工作的线程数量
-XX:ParallelGCThreads
指定分区大小(1MB~32MB,且必须是2的N次幂)默认将整堆划分为 2048 个分区
-XX:G1HeapRegionSize
目标暂停时间(默认200ms)
-XX:MaxGCPauseMillis
新生代内存初始空间(默认整堆5%)
-XX:G1NewSizePercent
新生代内存最大空间
-XX:G1MaxNewSizePercent
Survivor 区的填充容量(默认50%)Survivor 区域里的一批对象(年龄1+年龄2+年龄n的多个年龄对象)总和超过了Survivor区域的50%,此时就会把年龄n(含)以上的对象都放入老年代
-XX:TargetSurvivorRatio
最大年龄阈值(默认15)
-XX:MaxTenuringThreshold
老年代占用空间达到整堆内存阈值(默认45%),则执行新生代和老年代的混合收集(MixedGC),比如我们之前说的堆默认有2048个region,如果有接近1000个region都是老年代的region,则可能就要触发MixedGC了
-XX:InitiatingHeapOccupancyPercent
region中的存活对象低于这个值时才会回收该region,如果超过这个值,存活对象过多,回收的的意义不大。
-XX:G1MixedGCLiveThresholdPercent(默认85%)
在一次回收过程中指定做几次筛选回收(默认8次),在最后一个筛选回收阶段可以回收一会,然后暂停回收,恢复系统运行,一会再开始回收,这样可以让系统不至于单次停顿时间过长。
-XX:G1MixedGCCountTarget
gc过程中空出来的region是否充足阈值,在混合回收的时候,对Region回收都是基于复制算法进行的,都是把要回收的Region里的存活对象放入其他Region,然后这个Region中的垃圾对象全部清理掉,这样的话在回收过程就会不断空出来新的Region,一旦空闲出来的Region数量达到了堆内存的5%,此时就会立即停止混合回收,意味着本次混合回收就结束了。
-XX:G1HeapWastePercent(默认5%):
G1垃圾收集器优化建议
假设参数 -XX:MaxGCPauseMills 设置的值很大,导致系统运行很久,年轻代可能都占用了堆内存的 60% 了,此时才触发年轻代 GC。那么存活下来的对象可能就会很多,此时就会导致 Survivor 区域放不下那么多的对象,就会进入老年代中。
或者是你年轻代 GC 过后,存活下来的对象过多,导致进入 Survivor 区域后触发了动态年龄判定规则,达到了 Survivor 区域的50%,也会快速导致一些对象进入老年代中。
所以这里核心还是在于调节 -XX:MaxGCPauseMills 这个参数的值,在保证他的年轻代 GC 别太频繁的同时,还得考虑每次 GC 过后的存活对象有多少,避免存活对象太多快速进入老年代,频繁触发 mixed GC
什么场景适合使用G1
1. 50%以上的堆被存活对象占用。
2. 对象分配和晋升的速度变化非常大。
3. 垃圾回收时间特别长,超过1秒。
4. 8GB以上的堆内存(建议值)。
5. 停顿时间是500ms以内。