1 | java -XX:+PrintFlagsFinal -version | grep HeapSize # 查看堆内存配置的默认值 |
没有万能的JVM参数配置,如果有的话就可能是内存给大点,代码写好点,其它用默认 (JVM已经优化了很多参数)
常用配置
2C4G容器常见配置1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18-server
-Xcomp
-Xmx2g
-Xms2g
-Xmn800m
-XX:MetaspaceSize=512m
-XX:MaxMetaspaceSize=512M
-Xss256k
-XX:+DisableExplicitGC
-XX:+UseConcMarkSweepGC
-XX:+CMSParallelRemarkEnabled
-XX:+UseCMSCompactAtFullCollection
-XX:LargePageSizeInBytes=128m
-XX:+UseFastAccessorMethods
-XX:+UseCMSInitiatingOccupancyOnly
-XX:CMSInitiatingOccupancyFraction=75
-XX:+HeapDumpOnOutOfMemoryError
-DLog4jContextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector
2C2G激进配置1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26-Dfile.encoding=UTF-8
-Xcomp
-Xmx1400m
-Xms1400m
-Xmn700m
-XX:SurvivorRatio=3
-XX:NewRatio=1
-XX:MetaspaceSize=128m
-XX:MaxMetaspaceSize=128m
-Xss256k
-XX:+DisableExplicitGC
-XX:+UseConcMarkSweepGC
-XX:+CMSParallelRemarkEnabled
-XX:+UseCMSCompactAtFullCollection
-XX:LargePageSizeInBytes=128m
-XX:+UseFastAccessorMethods
-XX:+UseCMSInitiatingOccupancyOnly
-XX:CMSInitiatingOccupancyFraction=75
-XX:+HeapDumpOnOutOfMemoryError
-XX:+PrintGCDetails
-XX:+PrintGCTimeStamps
-XX:+PrintTenuringDistribution
-Xloggc:/Users/weikeqin1/jvm_gc.log
-XX:+UnlockDiagnosticVMOptions
-XX:+PrintInlining
-XX:+PrintCompilation
常用的JVM配置
-client
The client VM is tuned for reducing start-up time and memory footprint. Invoke it by using the -client JVM command-line option.
-server
The server VM is designed for maximum program execution speed. Invoke it by using the -server JVM command-line option.
-Dfile.encoding=UTF-8
文件使用UTF-8编码
-Xms2g
= -XX:InitialHeapSize=2g
= -XX:MinHeapSize=2g
设置初始堆大小为2G
-Xmx2g
= -XX:MaxHeapSize=2g
设置最大堆大小为2G
-Xmn1g
设置新生代大小为1G
-XX:MinHeapFreeRatio=
-XX:MaxHeapFreeRatio=
-XX:NewRatio
-XX:NewSize
-XX:MaxNewSize
-XX:+AggressiveHeap
-Xss256k
设置每个线程的堆栈大小
-XX:LargePageSizeInBytes=128m
内存页的大小不可设置过大, 会影响Perm的大小
-XX:MaxDirectMemorySize=536870912
-XX:+UseFastAccessorMethods
原始类型的快速优化
-XX:PetenureSizeThreshold=
设置直接被分配到老年代的最大阀值
-XX:+TraceClassLoading
打印类加载信息
配置垃圾回收算法
-XX:+UseG1GC 使用G1垃圾收集器
gc配置
-XX:+PrintGC
用于垃圾收集时的信息打印 -verbosegc (which is equivalent to -XX:+PrintGC) sets the detail level of the log to fine.
-XX:+PrintGCDetails
打印GC详细信息 ets the detail level to finer.
-XX:+PrintGCTimeStamps
输出GC的时间戳(以基准时间的形式 245469.1 )
-XX:+PrintGCDateStamps
输出GC的时间戳(以日期的形式,如 2013-05-04T21:53:59.234+0800)
-XX:+HeapDumpBeforeFullGC
FullGC前保存堆栈信息 测试环境使用,线上最好别用,小心磁盘被打满
-XX:+HeapDumpAfterFullGC
FullGC后保存堆栈信息 测试环境使用,线上最好别用,小心磁盘被打满
-XX:+DisableExplicitGC
禁止代码中显示调用GC
-Xloggc:filename
gc日志保存到指定文件 把filename替换成 /home/admin/gc.log
-XX:+HeapDumpOnOutOfMemoryError
OOM后保存堆栈信息
-XX:-OmitStackTraceInFastThrow
当大量抛出同样的异常的后,后面的异常输出将不打印堆栈
-XX:ErrorFile=logs/hs_err_pid%p.log
JIT config
JVM 的 JIT 机制的存在,如果某个函数被调用多次之后,JVM会尝试将其编译为机器码,从而提高执行速度。
在 Java8 之前,HotSpot 集成了两个 JIT,用 C1 和 C2 来完成 JVM 中的即时编译。
到了 Java9,AOT 编译器被引入。AOT 是在程序运行前进行的静态编译,这样就可以避免运行时的编译消耗和内存消耗,且 .class 文件通过 AOT 编译器是可以编译成 .so 的二进制文件的。
Java10,一个新的 JIT 编译器 Graal 被引入。Graal 是一个以 Java 为主要编程语言、面向 Java bytecode 的编译器。与用 C++ 实现的 C1 和 C2 相比,它的模块化更加明显,也更容易维护。Graal 既可以作为动态编译器,在运行时编译热点方法;也可以作为静态编译器,实现 AOT 编译。
1 | -xx:+TieredCompilation 设置分层编译 |
在编译过程中遇到方法调用时,将目标方法的方法体纳入编译范围之中,并取代原方法调用的优化手段,最重要的编译器优化
1 | #CompileThreshold must be between 0 and 268435455 |
方法调用计数器:用于统计方法被调用的次数
在关闭分层编译的情况下,方法调用计数器的默认阈值在 C1 模式下是 1500 次,在 C2 模式在是 10000 次,可通过 -XX:CompileThreshold 来设定;
而在分层编译的情况下,-XX:CompileThreshold 指定的阈值将失效,此时将会根据当前待编译的方法数以及编译线程数来动态调整。
1 | -XX:OnStackReplacePercentage=10000 |
回边计数器:用于统计一个方法中循环体代码执行的次数,
在字节码中遇到控制流向后跳转的指令称为“回边”(Back Edge),该值用于计算是否触发 C1 编译的阈值,
在不开启分层编译的情况下,C1 默认为 13995,C2 默认为 10700,可通过 -XX: OnStackReplacePercentage=N 来设置;
而在分层编译的情况下,-XX: OnStackReplacePercentage 指定的阈值同样会失效,此时将根据当前待编译的方法数以及编译线程数来动态调整。
在一些循环周期比较长的代码段中,当循环达到回边计数器阈值时,JVM 会认为这段是热点代码,JIT 编译器就会将这段代码编译成机器语言并缓存,在该循环时间段内,会直接将执行代码替换,执行缓存的机器语言。
1 | -XX:CICompilerCount=2 |
经常执行的方法,默认情况下,方法体大小小于 325 字节的都会进行内联,我们可以通过 -XX:MaxFreqInlineSize=N 来设置大小值;
不是经常执行的方法,默认情况下,方法大小小于 35 字节才会进行内联,我们也可以通过 -XX:MaxInlineSize=N 来重置大小值
1 | -XX:+PrintCompilation //在控制台打印编译过程信息 |