SAI AREA

Follow me on GitHub

零、参考资料

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