1. JVM 参数优化
1.1. 查看 JVM 默认参数
java -XX:+PrintFlagsInitial
1.2. 关键 JVM 参数
JVM 总体上可以分成三类:
-
:标准参数,比如 -verbose:gc 这类表示标准实现,所有的虚拟机都需要实现这些参数的功能,且向后兼容;-X
:非标准参数,默认 JVM 会实现这些参数的功能,但是不保证所有的 JVM 实现都满足,且不保证向后兼容;-XX
:非 Stable 参数,这些参数在不同的 JVM 上会有不同的实现,这些参数不推荐在生产环境中使用,以后很有可能会被取消,需要慎重使用;
JVM 参数类型:
- 布尔型参数:
-XX:+
表示打开,-XX:-
表示关闭。(比如-XX:+PrintGCDetails); - 数字型参数:通过
-XX:=
设定。数字可以是 m/M(兆字节),k/K(千字节),g/G(G 字节)。 - 字符行参数:通过
-XX:=
设定,通常用来指定一个文件,路径,或者一个命令列表。(比如-XX:HeapDumpPath=./java_pid.hprof)
-server
服务器模式下运行-Xms
用于设置 Java 虚拟机(JVM)启动时的初始堆内存大小-Xmx
用于指定 JVM 可以使用的最大堆内存大小-XX:MetaspaceSize
这个参数是初始化的 Metaspace 大小,该值越大触发 Metaspace GC 的时机就越晚。默认约 20.8 M。-XX:MaxMetaspaceSize
这个参数用于限制 Metaspace 增长的上限,防止因为某些情况导致 Metaspace 无限的使用本地内存,影响到其他程序。默认无上限。-XX:+UseG1GC
启用 G1 (Garbage-First) 垃圾回收器。-XX:MaxGCPauseMillis
设置一个目标值,指定 G1 GC 努力达到的最大垃圾回收暂停时间。默认 200 毫秒。-XX:ParallelGCThreads
设置并行垃圾回收器(Parallel Garbage Collector)使用的线程数。最佳值取决于系统的硬件配置和应用程序的具体需求。如果设置的值过高,可能会导致 CPU 资源过载,从而影响应用程序的性能。通常,线程数可以设置为与可用处理器核心数相等的值。-XX:+DisableExplicitGC
用于禁用 System.gc() 方法的显式垃圾回收功能。开发者可能会调用 System.gc() 来尝试管理内存或者优化性能。然而,频繁的垃圾回收可能会导致应用程序的性能下降,因为垃圾回收是一个计算密集型的过程,它会暂停应用程序的执行来回收不再使用的对象。使用该参数避免了可能的性能问题。-XX:+PrintGCDateStamps
用于在垃圾回收 (GC) 日志中添加时间戳。当启用此选项时,每次垃圾回收事件都会被记录,并且在记录中包含自 JVM 启动以来的绝对时间(以秒或毫秒为单位,取决于具体实现)-XX:+PrintGCDetails
启用此选项时,JVM 会在每次垃圾回收发生时,输出包含有关回收的详细数据的日志信息。-XX:+PrintTenuringDistribution
用于在每次垃圾回收事件后输出对象晋升老年代(Tenured Generation)的分布情况。帮助了解对象在年轻代(Young Generation)和老年代之间的年龄分布,从而对垃圾回收器的行为和内存管理策略进行分析和优化。-Xloggc
启用此选项时,JVM 会将每次垃圾回收的详细信息输出到指定的文件中。-XX:+HeapDumpOnOutOfMemoryError
用于在发生内存溢出错误(OutOfMemoryError)时自动生成堆内存转储文件(heap dump)。这个文件包含了所有活跃对象的详细信息,可以用来分析内存使用情况,查找内存泄漏或识别占用大量内存的对象。-XX:HeapDumpPath
指定生成的堆转储文件(heap dump)的存储路径和文件名。-XX:+PrintConcurrentLocks
打印 java.util.concurrent 的锁信息,在 SIGTERM 时触发。默认关闭,等价于运行 jstack -l-Dfile.encoding
设置文件的字符编码。选项设置的是系统属性 file.encoding 的值。这个属性不仅影响文件的读写操作,还可能影响其他与字符编码相关的操作,如网络通信、数据库连接等。-Djava.security.egd
SecureRandom 在 java 各种组件中使用广泛,可以可靠的产生随机数。但在大量产生随机数的场景下,性能会较低。这时可以使用-Djava.security.egd=file:/dev/./urandom
加快随机数产生过程。
建议:
- MetaspaceSize 和 MaxMetaspaceSize 设置一样大小,对于大部分项目 256M 即可
- 初始堆内存和最大堆内存设置一样大小
- PrintGCDateStamps、PrintGCDetails、PrintTenuringDistribution、loggc 一起配合使用
- HeapDumpOnOutOfMemoryError、HeapDumpPath 一起配合使用
- UseG1GC、MaxGCPauseMillis、ParallelGCThreads 一起配合使用
1.3. 最终参数优化结果
java -server \
-Xms4g -Xmx4g -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=256m \
-XX:+UseG1GC -XX:MaxGCPauseMillis=200 -XX:ParallelGCThreads=8 -XX:+DisableExplicitGC -XX:+PrintGCDateStamps -XX:+PrintGCDetails -XX:+PrintTenuringDistribution -Xloggc:logs/gc.log \
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=logs -XX:+PrintConcurrentLocks \
-Dfile.encoding=UTF-8 -Djava.security.egd=file:/dev/./urandom \
-jar demo.jar
标签:回收,XX,参数,内存,JVM,优化,垃圾
From: https://www.cnblogs.com/jason207010/p/18215711