1> 日志相关
- **-XX:OnOutOfMemoryError --> OOM时输出dump文件
- -XX:HeapDumpPath=./oom/ --> OOM时dump文件的存储位置
- -XX:+PrintGC --> 打印GC日志
- -XX:+PrintGCDetails --> 打印GC详细日志
- -XX:+PrintGCCause --> 打印GC的原因
- -XX:+PrintGCTimeStamps --> 输出GC发生的时间
- -XX:+PrintHeapAtGC --> 在GC发生时前后,打印堆栈日志
- -Xloggc:opt/log/gc.log --> 日志输出的文件
- -XX:+UseGCLogFileRotation --> 滚动记录GC日志
- -XX:NumberOfGCLogFiles=5 --> GC日志文件的数量
- -XX:GCLogFileSize=20M --> 每个GC日志文件的最大容量
2> GC基础环境
- **-Xmn -Xms -Xmx -Xss
年轻代 最小堆 最大堆 栈空间- -XX:+DisableExplictGC--> 禁用显式GC(System.gc())
- -XX:MaxTenuringThreshold --> 升代年龄,最大值15
- 设置元空间的初始大小、最大空间:
- -XX:MetaspaceSize=50m --> 设置元空间初始大小
- -XX:MaxMetaspaceSize=100m --> 设置元空间的最大空间
3> 针对PS、PO垃圾回收器
- -XX:PreTenureSizeThreshold -->大对象到底多大
- -XX:SurvivorRatio --> 新生代eden区和Survivor区的比例
- 默认为8,代码两个survivor区各占1份,eden区占8份
- -XX:MaxTenuringThreshold=n --> 新生代经历多少次GC晋升到老年代中的最大阈值
- -XX:+UseAdaptiveSizePolicy --> 自动选择各区大小比例
- JVM会根据当前系统动态调整-Xmn、-XX:SurvivotRatio等参数,来提供更合适的停顿时间或最大的吞吐量。
- 推荐只设置好内存数据大小-Xmx、使用-XX:MaxGCPauseMillis、-XX:GCTimeRatio给JVM设置一个优化目标。然后使用自适应调节策略。
- -XX:+ParallelGCThreads
并行收集器的线程数,同样适用于CMS,一般设为和CPU核数相同
4> CMS
CMS从理论到开发出来用了10年,它具有跨时代的意义。碎片化、浮动垃圾问题 --> G1
- -XX:+UseConcMarkSweepGC --> 使用CMS垃圾回收器
- -XX:CMSInitiatingOccupancyFraction
- 表示使用多少比例的老年代后开始CMS收集,默认是68%(近似值),如果频繁发生SerialOld卡顿,应该调小,(但是会频繁CMS回收)
- -XX:+UseCMSCompactAtFullCollection --> 在FGC时进行压缩
- -XX:CMSFullGCsBeforeCompaction**=4** --> 多少次FGC之后进行压缩
- XX:+CMSScavengeBeforeRemark --> 重新标记之前进行一个YGC,减少重新标记阶段STW的时间
- -XX:+CMSParallelInitialMarkEnabled --> 可以开启初始标记并行化加快此阶段处理速度。
- 线程数不要超过CPU核数。
- -XX:ParallelCMSThreads --> CMS线程数量,最好核心线程数量的一半;
5> G1
- -XX:+UseG1GC --> 使用G1垃圾回收器
- -XX:G1NewSizePercent --> 新生代最小比例,默认为5%
- -XX:G1MaxNewSizePercent=n --> 新生代最大比例,默认为60%
- -XX:MaxGCPauseMillis=n --> 一次GC的最大STW时间(单位:ms,默认200ms),G1会尝试调整Young区的块数来达到这个值。
- -XX:+G1HeapRegionSize=n —> 分区大小,建议逐渐增大该值,1 2 4 8 16 32。
- 随着size增加,垃圾的存活时间更长,GC间隔更长,但每次GC的时间也会更长
ZGC做了改进(动态区块大小)
- -XX:InitiatingHeapOccupancyPercent=45 --> 老年代占用空间达到整堆内存阈值(默认45%)时,启动MixedGC;回收所有的Young和部分Old,以及大对象区。