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 --> 日志输出的文件

-Xloggc:./logs/gc/cache-gc-%t.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,以及大对象区。