JVM 常用参数
JVM 参数类型:
- 标准: -开头,所有的 HotSpot 都支持
- 非标准:-X 开头,特定版本 HotSpot 支持特定命令,不能保证所有 JVM 实现都支持它们,并且它们可能会发生变化。
- 高级选项:-XX 开头,这些是开发人员选项,用于调整 Java HotSpot 虚拟机操作的特定区域,这些区域通常具有特定的系统要求,并且可能需要对系统配置参数的特权访问。也不能保证所有 JVM 实现都支持它们,并且它们可能会发生变化。
可以使用 java -XX:+PrintFlagsFinal –version
打印所有 -XX
默认参数信息,manageable
表示是可以运行时修改的参数(通过 jinfo 命令)
内存分配
- 虚拟机栈:
–Xss
默认 1M,不同系统或有不同。-Xss256k
- 方法区
- jdk 1.7 以前(永久代)
-XX:PermSize -XX:MaxPermSize
- jdk 1.8 以后(元空间,本地内存)
-XX:MetaspaceSize -XX:MaxMetaspaceSize
默认无限制
- jdk 1.7 以前(永久代)
- 堆
-Xms
最小值-Xmx
最大值-Xmn
新生代大小-XX:NewSize
新生代最小值-XX:MaxNewSize
新生代最大值-XX:SurvivorRatio
Eden 与 Survivor 区的比例
- 直接内存(堆外内存)
-XX:MaxDirectMemorySize
设置大小,默认是堆的最大值(配置的最大值减去一个Survivor的大小)-XX:NativeMemoryTracking=detail
开启 NMT,跟踪直接内存的使用情况(Native方法)
-XX:+AlwaysPreTouch
在 JVM 启动的时候,就把所有的内存在操作系统进行分配
内存溢出日志:
-XX:-HeapDumpOnOutOfMemoryError
OOM 时输出一个 dump 文件,默认关闭,推荐在生产服务器开启-XX:HeapDumpPath=./java_pid<pid>.hprof
dump 文件的存储路径,默认是 java 进程启动位置
GC
策略:
-XX:MaxTenuringThreshold
进入老年代的 GC 年龄,默认15,CMS是6-XX:PretenureSizeThreshold
直接进入老年代的大对象的大小-XX:HandlePromotionFailure
空间分配担保-Xnoclassgc
禁止回收 Class 对象-XX:+DisableExplicitGC
禁止在运行期显式地调用System.gc()
日志:
-XX:+PrintGC -XX:+PrintGCDetails
-XX:+PrintHeapAtGC
每次一次 GC 后,都打印堆信息-XX:+PrintGCTimeStamps
在每个 GC 上打印时间戳-XX:+PrintGCDateStamps
在每个 GC 上打印时间戳,以日期的形式-XX:+PrintGCApplicationConcurrentTime
打印应用程序时间-XX:+PrintGCApplicationStoppedTime
打印暂停时长-XX:+PrintReferenceGC
记录回收了多少种不同引用类型的引用-Xlogger:logpath
GC 日志路径
垃圾回收器:
- Serial/Serial Old:
-XX:+UseSerialGC
- ParallerGC/Parallel Old:
-XX:+UseParallelGC
-XX:MaxGCPauseMillis
最大停顿时间-XX:GCTimeRatio
垃圾收集时间占总时间的比率-XX:+UseAdaptiveSizePolicy
动态调整,默认开启-XX:+ParallelGCThreads
并行收集器的线程数
- ParNew/CMS:
-XX:+UseConcMarkSweepGC
-XX:+UseCMSCompactAtFullCollection
默认开启,无法分配大对象和发生 FGC 时,使用 Serial Old 进行内存碎片整理-XX:CMSInitiatingOccupancyFraction
使用多少比例的老年代后开始 CMS 收集,默认是 68%(近似值),如果频繁发生 SerialOld 卡顿,应该调小(频繁CMS 回收)-XX:CMSFullGCsBeforeCompaction
多少次 FGC 之后进行压缩-XX:+CMSClassUnloadingEnabled
启用类卸载,默认启用-XX:CMSInitiatingPermOccupancyFraction
达到什么比例时进行 Perm 回收(永久代),JDK 8 中不推荐使用此选项,不能替代-XX:GCTimeRatio
设置 GC 时间占用程序运行时间的百分比(不推荐使用)-XX:MaxGCPauseMillis
停顿时间,是一个建议时间,GC 会尝试用各种手段达到这个时间,比如减小年轻代
- G1:
-XX:+UseG1GC
-XX:G1HeapRegionSize
Region 大小,1MB ~ 32MB ,2 的 N 次幂-XX:MaxGCPauseMillis
最大 GC 暂停时间-XX:GCPauseIntervalMillis
GC 的间隔时间-XX:G1NewSizePercent
新生代最小比例,默认为 5%-XX:G1MaxNewSizePercent
新生代最大比例,默认为 60%-XX:GCTimeRatioGC
时间建议比例,G1 会根据这个值调整堆空间-XX:ConcGCThreads
线程数量-XX:InitiatingHeapOccupancyPercent
启动 G1 的堆空间占用比例,根据整个堆的占用而触发并发 GC 周期-XX:MaxGCPauseMillis
设置最大 GC 暂停时间的目标(以毫秒为单位)。这是一个软目标,并且 JVM 将尽最大的努力(G1 会尝试调整 Young 区的块数来)来实现它。默认情况下,没有最大暂停时间值。
优化
TLAB:-XX:+UseTLAB
本地线程分配缓冲,默认开启
-XX:TLABSize
设置 TLAB 大小-XX:+PrintTLAB
打印 TLAB 的使用情况
JIT:
-XX:+DoEscapeAnalysis
逃逸分析,默认开启-XX:+PrintEscapeAnalysis
查看逃逸分析的筛选结果-XX:ReservedCodeCacheSize
限制 JITCodeCache
的大小-XX: CompileThreshold
方法调用计数器阈值。默认客户端模式下是 1500 次,在服务端模式下是 10000 次-XX:FreqInlineSize
经常执行的方法,默认情况下,方法体大小小于 325 字节的都会进行方法内联-XX:MaxInlineSize
不是经常执行的方法,默认情况下,方法大小小于35 字节才会进行方法内联-XX:+PrintInlining
将内联方法打印出来-XX:+EliminateLocks
开启锁消除, JDK 108 默认开启-XX:+EliminateAllocations
开启标量替换,JDK 1.8 默认开启-XX:+PrintEliminateAllocations
查看标量的替换情况
禁用偏向锁:-XX:-UseBiasedLocking
默认开启
压缩指针技术:-XX:+UseCompressedOops
默认开启
JVM 诊断:-XX:+UnlockDiagnosticVMOptions
解锁对 JVM 进行诊断的选项参数,开启后支持一些特定参数对 JVM 进行诊断
类加载
-
-Xverify:none
关闭大部分的类验证措施 -
-Xbootclasspath
指定 Bootstrap Class Loader 加载路径 -
-Djava.ext.dirs
指定 Extention Class Loader 加载目录 -
-verbose:class
打印类加载详细过程 -
-XX:+TraceClassLoading
打印 class 加载的过程和具体的 class 信息
日志
JVM 参数:
-XX:+PrintVMOptions
可在程序运行时,打印虚拟机接受到的命令行显示参数-XX:+PrintFlagsFinal
打印所有的 JVM 参数-XX:+PrintFlagsInitial
查看所有 JVM 参数启动的初始值
编译:
-XX:+PrintCompilation
打印编译过程信息
其他
-XX:AutoBoxCacheMax
修改IntegerCache
的上限