零、参考资料
Java虚拟机规范(Java SE 8版)
Java语言规范基于Java SE 8
深入理解Java虚拟机——JVM高级特性与最佳实践
实战Java虚拟机——JVM故障诊断与性能优化
垃圾回收的算法与实现
深入理解计算机系统
Stackoverflow:
https://stackoverflow.com/questions/16549066/java-major-and-minor-garbage-collections
OpenJdk:
https://openjdk.java.net/jeps/122
Oracle官方DOC:
https://docs.oracle.com/javase/8/javase-books.htm
https://docs.oracle.com/en/java/javase/13/
https://docs.oracle.com/javase/specs/jvms/se8/jvms8.pdf
https://www.oracle.com/webfolder/technetwork/tutorials/mooc/JVM_Troubleshooting/week1/lesson1.pdf
https://www.oracle.com/webfolder/technetwork/tutorials/obe/java/gc01/index.html
一、常用JVM参数
1.GC参数
1.1.打印GC基本日志
JDK8: -XX:PrintGC JDK9+: -Xlog:gc
1.2.打印GC详细日志
JDK8: -XX:PrintGCDetails JDK9+: -Xlog:gc*
-XX:PrintGCDetails 还会使JVM在退出前打印堆详细信息
1.3.打印GC时堆的全面信息
JDK8: -XX:PrintHeapAtGC JDK9+:移除
1.4.打印GC发生时间
JDK8: -XX:PrintGCTimeStamps JDK9+: -Xlog:gc*已包含
1.5.打印程序执行时间
-XX:+PrintGCApplicationConcurrentTime
1.6.打印程序因STW而停顿的时间
-XX:+PrintGCApplicationStoppedTime
1.7.打印软引用、弱引用、虚引用和Finallize队列信息
JDK8: +PrintReferenceGC JDK9+移除
1.8.输出GC信息至文本
JDK8:-Xloggc:log/${filePath} JDK9+:-Xlog:gc:log/${filePath}
1.9.打印类加载日志
JDK8: -XX:+TraceClassLoading JDK9+: -Xlog:class+load=info
1.10.打印类卸载日志
JDK8: -XX:+TraceClassUnLoading JDK9+: -Xlog:class+unload=info
1.11.显示当前的类信息柱状图
-XX:+PrintClassHistogram
1.12.查看JVM运行显示参数
-XX:+PrintVMOptions
1.13.打印JVM显示和隐式(默认)参数
-XX:+PrintCommandLineFlags
1.14.打印所有系统参数
-XX:+PrintFlagsFinal
1.15.在新生代和老年代使用串行回收器
-XX:UseSerialGC
1.16.在新生代使用并行回收器
-XX:+UseParNewGC
1.17.在老年代使用并行回收器
-XX:+UseParallelOldGC
1.18.设置用于垃圾回收的线程数
-XX:ParallelGCThreads
1.19.设置最大GC停顿时间
-XX:MaxGCPauseMillis
1.20.设置吞吐量大小
-XX:GCTimeRatio
1.21.打开开自适应GC策略
-XX:+UseAdaptiveSizePolicy
1.22.使用G1
-XX:+UseG1GC
1.23.设置停顿间隔
-XX:GCPauseIntervalMillis
1.24.使用CMS
-XX:+UseConcMarkSweepGC
1.25.设置CMS线程数
-XX:ParallelCMSThreads
1.26.设置CMS触发时,老年代比例
-XX:CMSInitiatingOccupancyFraction
1.27.设置CMS在FullGC后是否进行碎片整理
-XX:+UseCMSCompactAtFullCollection
1.28.设置CMS进行内存压缩前,FullGC次数
-XX:CMSFullGCsBeforeCompaction
1.29.允许对类元数据回收
-XX:+CMSClassUnloadingEnabled
1.30.设置CMS触发时,永久区比例,仅在激活CMSClassUnloadingEnabled时有效
-XX:CMSInitiatingPermOccupancyFraction
1.31.只有达到阈值才执行CMS GC
-XX:UseCMSInitiatingOccupancyOnly
##2.堆参数
2.1.初始堆空间
-Xms
2.2.最大堆空间
-Xmx
2.3.设置新生代大小
-Xmn
2.4.设置新生代中eden区和from/to区的比例
-XX:SurvivorRatio
SurvivorRatio=eden/from=eden/to
2.5.设置新生代与老年代的比例
-XX:NewRatio
NewRatio=老年代/新生代
2.6.设置在内存溢出时到处整个堆信息
-XX:+HeapDumpOnOutOfMemoryError
2.7.设置导出堆文件存放路径
-XX:HeapDumpPath
与-XX:+HeapDumpOnOutOfMemoryError配合
2.8.设置大对象直接进入老年代的阈值
-XX:MaxTenuringThreshold
##3. 非堆参数
3.1.最大直接内存
-XX:MaxDirectMemorySize
如果不设置,则默认与-Xmx相同
3.2.每个线程的栈大小
-Xss
3.3.打开TLAB
-XX:+UseTLAB
3.4.打印TLAB相关信息
-XX:+PrintTLAB
JDK9+不支持
3.5.TLAB大小设置
-XX:TLABSize
3.6.设置TLAB大小自动调整
-XX:+ResizeTLAB
##4.其他参数
4.1.设置工作模式为客户端
-client
4.2.设置工作模式为服务端
-server
4.3.禁用System.gc()(显示GC)
-XX:+DisableExplicitGC
4.4.设置并发处理显示GC
-XX:+ExplicitGCInvokesConcurrent
4.5.后台编译
-XX:+BackgroundCompilation
4.6.开启逃逸分析
-XX:+DoEscapeAnalysis
仅在server模式下有效
4.7.打开标量替换
-XX:+EliminateAllocation
4.8.开启解释执行模式
-Xint
4.9.开启编译模式
-Xcomp
4.10.开启混合模式民,
-Xmixed