G1 GC 总结
在某些情况下,G1触发了Full GC,这时G1会退化使用Serial收集器来完成垃圾的清理工作,它仅仅使用单线程来完成GC工作, GC暂停时间将达到秒级别的.整个应用处于假死状态,不能处理任何请求
一.Full GC 的情况:
- 并发模式失败: G1启动标记周期, 但在Mix GC之前,老年代就被填满,这时候G1会放弃标记周期.
解决方法:
a.增加堆大小
b.调整周期(例如增加线程数-XX:ConcGCThreads等)
- 晋升失败或者疏散失败: G1在进行GC的时候没有足够的内存供存活对象或晋升对象使用,由此触发了Full GC.可以在日志中看到(to-space exhausted)或者(to-space overflow)
解决方法:
a.增加 -XX:G1ReservePercent 选项的值(并相应增加总的堆大小),为“目标空间”增加预留内存量.
b.减少 -XX:InitiatingHeapOccupancyPercent 提前启动标记周期.
c.增加 -XX:ConcGCThreads 选项的值来增加并行标记线程的数目.
- 巨型对象分配失败:当巨型对象找不到合适的空间进行分配时,就会启动Full GC,来释放空间.
解决方法:
a.增加内存
b.增大-XX:G1HeapRegionSize,使巨型对象不再是巨型对象.
二.避免使用以下参数:
避免使用 -Xmn 选项或 -XX:NewRatio 等其他相关选项显式设置年轻代大小.固定年轻代的大小会覆盖暂停时间目标.
三.使用场景:
G1收集器首要关注的是为用户运行着需要大堆空间、限制的垃圾回收延迟的应用提供一个解决方案.这意味着堆大小为6GB左右或者更大,稳定的、可预言的暂停时间小于0.5秒.
如果应用有以下一个或多个特点,当下运行着 CMS 或 ParallelOldGC 垃圾收集器的应用把收集器切换到G1收集器的话,非常适合:
- Full GC 持续时间太长或者太频繁
- 对象分配比率或者提升有显著的变化
- 不期望的长时间垃圾收集或者压缩暂停(大于0.5到1秒)
# 使用G1 GC
wrapper.java.additional.8=-XX:+UseG1GC
# 解锁实验性虚拟机标志
wrapper.java.additional.9=-XX:+UnlockExperimentalVMOptions
wrapper.java.additional.10=-XX:+UnlockDiagnosticVMOptions
# 设置的 G1 区域的大小.值是 2 的幂,范围是 1 MB 到 32 MB 之间.目标是根据最小的 Java 堆大小划分出约 2048 个区域.
wrapper.java.additional.11=-XX:G1HeapRegionSize=8
# 为所需的最长暂停时间#设置目标值.默认值是 200 毫秒.如果MaxGCPauseMillis设置的过小,GC就会频繁,吞吐量就会下降.如果MaxGCPauseMillis设置的过大,应用程序暂停时间就会变长.G1的默认暂停时间是200毫秒.
wrapper.java.additional.12=-XX:MaxGCPauseMillis=200
# 设置要用作年轻代大小最小值的堆百分比.默认值是 Java 堆的 5%.这是一个实验性的标志.有关示例,请参见“如何解锁实验性虚拟机标志”.此#设置取代了 -XX:DefaultMinNewGenPercent 设置.Java HotSpot VM build 23 中没有此设置.
wrapper.java.additional.13=-XX:G1NewSizePercent=5
# 设置要用作年轻代大小最大值的堆大小百分比.默认值是 Java 堆的 60%.这是一个实验性的标志.此设置取代了 -XX:DefaultMaxNewGenPercent 设置.Java HotSpot VM build 23 中没有此设置.
wrapper.java.additional.14=-XX:G1MaxNewSizePercent=60
# 设置 STW 工作线程数的值.将 n 的值#设置为逻辑处理器的数量.n 的值与逻辑处理器的数量相同,最多为 8.
# 如果逻辑处理器不止八个,则将 n 的值#设置为逻辑处理器数的 5/8 左右.这适用于大多数情况,除非是较大的 SPARC 系统,其中 n 的值可以是逻辑处理器数的 5/16 左右.
wrapper.java.additional.15=-XX:ParallelGCThreads=10
# 设置并行标记的线程数.将 n #设置为并行垃圾回收线程数 (ParallelGCThreads) 的 1/4 左右.
wrapper.java.additional.16=-XX:ConcGCThreads=8
# 设置触发标记周期的 Java 堆占用率阈值.默认占用率是整个 Java 堆的 45%.
wrapper.java.additional.17=-XX:InitiatingHeapOccupancyPercent=45
# 为混合垃圾回收周期中要包括的旧区域设置占用率阈值.默认占用率为 65%.这是一个实验性的标志.此设置取代了 -XX:G1OldCSetRegionLiveThresholdPercent 设置.Java HotSpot VM build 23 中没有此设置.
wrapper.java.additional.18=-XX:G1MixedGCLiveThresholdPercent=65
# 设置您愿意浪费的堆百分比.如果可回收百分比小于堆废物百分比,Java HotSpot VM 不会启动混合垃圾回收周期.默认值是 10%.Java HotSpot VM build 23 中没有此设置.
wrapper.java.additional.19=-XX:G1HeapWastePercent=10
# 设置标记周期完成后,对存活数据上限为 G1MixedGCLIveThresholdPercent 的旧区域执行混合垃圾回收的目标次数.默认值是 8 次混合垃圾回收.混合回收的目标是要控制在此目标次数以内.Java HotSpot VM build 23 中没有此设置.
wrapper.java.additional.20=-XX:G1MixedGCCountTarget=8
# 设置混合垃圾回收期间要回收的最大旧区域数.默认值是 Java 堆的 10%.Java HotSpot VM build 23 中没有此设置.
wrapper.java.additional.21=-XX:G1OldCSetRegionThresholdPercent=10
# 设置作为空闲空间的预留内存百分比,以降低目标空间溢出的风险.默认值是 10%.增加或减少百分比时,请确保对总的 Java 堆调整相同的量.Java HotSpot VM build 23 中没有此设置.
wrapper.java.additional.22=-XX:G1ReservePercent=10
# 手动开启Java String对象的分割工作,这个是JDK8u20之后新增的参数,主要用于相同String避免重复申请内存,节约Region的使用;
wrapper.java.additional.23=-XX:+UseStringDeduplication
# 关闭GC时间过长系统自动检测OOM(OutOfMemory)提示GC overhead limit exceeded,目的是显示内存溢出异常,方便Wrapper Service检测到并重启
wrapper.java.additional.24=-XX:-UseGCOverheadLimit
#设置垃圾最大存活阀值.如果设置为0的话,则年轻代对象不经过Survivor区,直接进入年老代.对于年老代比较多的应用,可以提高效率.如果将此值设置为一个较大值,则年轻代对象会在Survivor区进行多次复制,这样可以增加对象再年轻代的存活时间,增加在年轻代即被回收的概论.默认值:15
wrapper.java.additional.25=-XX:MaxTenuringThreshold=3
# 取消 内存整理,G1GC 天生优势
wrapper.java.additional.26=-XX:-ResizePLAB
wrapper.java.additional.27=-XX:+PrintAdaptiveSizePolicy
wrapper.java.additional.28=-XX:+ParallelRefProcEnabled
wrapper.java.additional.29=-XX:+G1SummarizeConcMark
# 开启GC日志
wrapper.java.additional.30=-verbose:gc
wrapper.java.additional.31=-XX:+PrintGCDetails
wrapper.java.additional.32=-XX:+PrintGCDateStamps
wrapper.java.additional.33=-XX:+PrintGCApplicationStoppedTime # 打印应用停留时间
wrapper.java.additional.34=-XX:+PrintTenuringDistribution # 老年代分布
wrapper.java.additional.35=-Xloggc:../logs/gc.log
wrapper.java.additional.36=-XX:+UseGCLogFileRotation
wrapper.java.additional.37=-XX:NumberOfGCLogFiles=10
wrapper.java.additional.38=-XX:GCLogFileSize=128M
原文地址:
https://www.cnblogs.com/wgslucky/p/11764769.html
作者:Jeebiz 创建时间:2020-06-05 22:00
更新时间:2024-10-26 16:27
更新时间:2024-10-26 16:27