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:JavaEEJavaEE_2022_0311JVMTestsrc>java -XX:+PrintCommandLineFlags com.studio.Test
-XX:InitialHeapSize=265097920
-XX:MaxHeapSize=4241566720
-XX:+PrintCommandLineFlags
-XX:+UseCompressedClassPointers
-XX:+UseCompressedOops
-XX:-UseLargePagesIndividualAllocation
-XX:+UseParallelGC