1)堆栈大小相关设置
功能 |
参数 |
说明 |
堆栈大小设置 |
-Xms512m |
等价于-XX:InitialHeapSize,设置JVM初始堆内存为512M |
-Xmx2048m |
等价于-XX:MaxHeapSize,设置JVM最大堆内存为2048M |
-Xss256k |
等价于 -XX:ThreadStackSize,设置Java线程堆栈大小 |
-Xmn |
设置新生代的空间大小,一般不配置 |
-XX:-UseAdaptiveSizePolicy |
关闭自适应的内存分配策略 |
方法区 |
JDK7 |
-XX:PermSize=100m |
-XX:MaxPermSize=100m |
JDK8 |
-XX:MetaspaceSize=100m |
-XX:MaxMetaspaceSize=100m |
比例设置 |
-XX:SurvivorRatio=8 |
设置新生代中Eden区与Survivor区的比例,默认值是8,即Eden:so:s1=8:1:1 |
-XX:NewRatio=2 |
设置新生代与老年代的比例,默认值是2 |
大小说明
一般将-Xms和-Xmx配置成一样的值,目的是为了能够在Java垃圾回收机制清理完堆区后不需要重新分隔计算堆区的大小,从而提高性能。
默认情况下,初始堆大小:物理内存大小的1/64。最大堆大小:物理内存大小的1/4或1G。
参考官方文档:https://docs.oracle.com/javase/8/docs/technotes/guides/vm/gc-ergonomics.html
Xms60m -Xmx60m -Xss512k
自适应说明
注:
1)默认SurvivorRatio=8,但是在运行的过程中,JVM可能会动态调整,即使关闭自适应参数(-XX:-UseAdaptiveSizePolicy)也会动态调整,解决办法是显式指定-XX:SurvivorRatio=8。
2)-Xmn可以设置新生代的空间的大小与NewRatio参数冲突,如果设置了以-Xmn为准。
2)输出GC日志
功能 |
参数 |
说明 |
输出GC日志 |
-verbose:gc |
打印GC简要信息 |
‐XX:+PrintGC |
输出GC日志 |
‐XX:+PrintGCDetails |
输出GC的详细日志 |
‐XX:+PrintGCTimeStamps |
输出GC的时间戳(以基准时间的形式) |
‐XX:+PrintGCDateStamps |
输出GC的时间戳(以日期的形式,如 2013‐05‐04T21:53:59.234+0800) |
‐XX:+PrintHeapAtGC |
在进行GC的前后打印出堆的信息 |
‐Xloggc:../logs/gc.log |
日志文件的输出路径 |
-XX:+UseG1GC
-XX:MaxGCPauseMillis=100
-Xmx16m
-XX:+PrintGCDetails
-XX:+PrintGCTimeStamps
-XX:+PrintGCDateStamps
-XX:+PrintHeapAtGC
-Xloggc:E://gc.log
3)OOM时输出Heap dump(堆转储)
功能 |
参数 |
说明 |
OOM时输出Heap dump(堆转储) |
-XX:+HeapDumpOnOutOfMemoryError |
OOM时输出堆dump文件 |
-XX:HeapDumpPath=/opt/dump.hprof |
指定堆dump文件的位置 |
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=/opt/3.hprof
4)垃圾收集
功能 |
参数 |
说明 |
串行垃圾收集器 |
-XX:+UseSerialGC |
开启这个参数,新生代和老年代都是串行,Client模式下默认 |
新生代ParNew垃圾收集器 |
‐XX:+UseParNewGC |
新生代使用ParNew回收器,老年代使用串行收集器,老年代可以搭配CMS |
-XX:ParallelGCThreads=10 |
新生代并行线程数量 |
老年代CMS垃圾收集器(低延迟) |
-XX:+UseConcMarkSweepGC |
老年代使用CMS垃圾收集器,只能与Serial和ParNew搭配,不能和Parallel搭配。JDK8下开启CMS,新生代默认使用ParNew收集器。 |
-XX:CMSInitiatingOccupancyFraction=-1 |
设置堆内存使用率的域值,达到域值便开始回收 |
-XX:+UseCMSCompactAtFullCollection |
用于指定在执行完Full GC后对内存空间进行压缩,避免内存碎片。不过内存压缩整理过程无法并发执行,所以停顿时间变得更长。 |
-XX:CMSFullGCsBeforeCompaction=0 |
设置在执行多少次Full GC后对内存空间进行压缩整理。 |
-XX:ConcGCThreads=3 |
(早期JVM版本也叫-XX:ParallelCMSThreads)定义并发CMS过程运行时的线程数。 |
ParallelGC垃圾收集器(吞吐量优先) |
-XX:+UseParallelGC |
新生代并行垃圾收集器,JDK8默认 |
-XX:+UseParallelOldGC |
老年代并行垃圾收集器,JDK8默认,这两参数开启一个,另一个自动开启 |
-XX:ParallelGCThreads=10 |
新生代并行线程数量 |
-XX:MaxGCPauseMillis |
设置最大的垃圾收集时的停顿时间(STW),单位为毫秒。 注意:ParallelGC为了达到设置的停顿时间,可能会调整堆大小或其他的参数,如果堆的大小设置的较小,就会导致GC工作变得很频繁,反而可能会影响到性能。该参数使用需谨慎。 |
-XX:GCTimeRatio |
设置垃圾回收时间占程序运行时间的百分比,公式为1/(1+n)。 它的值为0~100之间的数字,默认值为99,也就是垃圾回收时间不能超过1% |
-XX:+UseAdaptiveSizePolicy |
自适应GC模式,垃圾回收器将自动调整年轻代、老年代等参数,达到吞吐量、堆大小、停顿时间之间的平衡。 一般用于,手动调整参数比较困难的场景,让收集器自动进行调整。 |
G1 |
-XX:+UseG1GC |
使用G1垃圾收集器 |
-XX:MaxGCPauseMillis=200 |
设置期望达到的最大GC停顿时间指标(JVM会尽力实现,但不保证达到),默认值是200毫秒。 |
-XX:G1HeapRegionSize=1048576 |
设置的G1区域的大小。值是2的幂,范围是1MB到32MB之间。目标是根据最小的Java堆大小划分出约2048 个区域。默认是堆内存的1/2000。 |
-XX:ParallelGCThreads=10 |
设置STW工作线程数的值。将n的值设置为逻辑处理器的数量。n的值与逻辑处理器的数量相同,最多为8。 |
-XX:ConcGCThreads=3 |
设置并行标记的线程数。将n设置为并行垃圾回收线程数 (ParallelGCThreads) 的1/4左右。 |
-XX:InitiatingHeapOccupancyPercent=45 |
设置触发标记周期的Java堆占用率阈值。默认占用率是整个Java堆的45%。 |
性能参数 |
-XX:MaxTenuringThreshold |
进入养老区的次数,默认15 |
-XX:+DisableExplicitGC |
禁用System.gc() |
5)其他参数
功能 |
参数 |
说明 |
编译器模式 |
-Xint |
完全采用解释器模式执行程序 |
-Xcomp |
完全采用即使编译器执行程序,如果即时编译出现问题,解释编译会介入执行 |
-Xmixed |
采用解释器+即使编译器的混合模式共同执行程序 |
TLAB |
-XX:+UseTLAB |
开启TLAB,默认开启 |
-XX:TLABWasteTargetPercent=1 |
TLAB默认占Eden区的1% |
默认参数 |
-XX:+PrintFlagsInitial |
查看所有参数的默认初始值 |
-XX:+PrintFlagsFinal |
查看所有参数的最终值 |
其他 |
-XX:+DoEscapeAnalysis |
逃逸分析,默认开启 |
-XX:+EliminateAllocations |
标量替换,默认开启 |
-XX:CompileThreshold=10000 |
JIT编译方法计数器,client模式默认是1500,server模式默认是10000 |
-XX:+PrintCommandLineFlags |
打印命令行参数(包含垃圾收集器) |
D:\JavaEE\JavaEE_2022_0311\JVMTest\src>java -XX:+PrintCommandLineFlags com.studio.Test
-XX:InitialHeapSize=265097920
-XX:MaxHeapSize=4241566720
-XX:+PrintCommandLineFlags
-XX:+UseCompressedClassPointers
-XX:+UseCompressedOops
-XX:-UseLargePagesIndividualAllocation
-XX:+UseParallelGC