在生产环境中,配置JVM启动参数是一项重要的任务,可以通过这些参数优化Java应用程序的性能、内存管理和调试等方面。以下是一些常见的示例:
1),GC相关参数配置
A,配置实战案例
开启GC日志生成,写入到指定的目录,并设置日志按照指定大小进行滚动生成。
## 2023年8月29日 10:43:30 尝试生成gc文件
java -jar -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:/home/demo/logs/gc/gc-test.log -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=10 -XX:GCLogFileSize=512k xxx.jar
B,配置参数说明
-
-XX:+PrintGCDetails
:输出GC的详细日志; -
-XX:+PrintGCDateStamps
:输出GC的日期戳; -
-Xloggc:/path/to/dir
:指定GC日志路径; -
-XX:+UseGCLogFileRotation
:打开GC日志滚动记录功能; -
-XX:NumberOfGCLogFiles
:设置滚动日志文件的个数,必须大于等于1,日志文件命名策略是,.0, .1, …, .n-1,其中n是该参数的值; -
-XX:GCLogFileSize
:设置滚动日志文件的大小,必须大于512k,当前写日志文件大小超过该参数值时,日志将写入下一个文件;
2),堆内存相关参数配置
A,配置案例
java -jar -Xms2g -Xmx4g -XX:NewRatio=2 -XX:PermSize=256m -XX:MaxPermSize=512m xxx.jar
B,配置参数说明:
-
-Xms2g -Xmx4g
:设置初始堆大小和最大堆大小,这将设置初始堆大小为2GB,最大堆大小为4GB。 -
-XX:NewRatio=2
:设置新生代和老年代的比例为1:2 -
-XX:PermSize=256m -XX:MaxPermSize=512m
:设置永久代/元空间的大小,这将指定永久代(对于旧版Java)或元空间(对于Java 8+)的初始大小为256MB,最大大小为512MB。
3),堆内存默认配置
A,如果内存小于192兆字节(MB)
- 堆内存的最大值为物理内存的"1/2",例如设备本身具有128M物理内存,则最大堆大小为64 MB;
- 堆内存的最小值,不得少于8M;
B,如果内存大于192兆字节(MB)
- 此时堆内存的最大值便是物理内存的"1/4",例如设备本身的内存是1G,那么最大的堆内存大小为256M。
- 此时最小的堆内存将会物理的内存的"1/64"。例如设备本身的内存是1G,那么最小的堆内存大小为16M。
C,共性
- JVM初始分配的内存由
-Xms
指定; - JVM最大分配的内存由
-Xmx
指定; - 默认空余堆内存小于40%时,JVM就会增大堆直到
-Xmx
的最大限制;空余堆内存大于70%时,JVM会减少堆直到-Xms的最小限制。因此服务器一般设置-Xms、-Xmx
相等以避免在每次GC后调整堆的大小。 - JVM使用
-XX:PermSize
设置非堆内存初始值,默认是物理内存的"1/64";由-XX:MaxPermSize
设置最大非堆内存的大小,默认是物理内存的"1/4"。
4),实际生产环境配置
gc日志生成与堆内存配置示例
nohup java -jar -Xms2g -Xmx4g -XX:NewRatio=2 -XX:PermSize=256m -XX:MaxPermSize=512m -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:/home/demo/logs/gc/gc-test.log -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=10 -XX:GCLogFileSize=512k $APP_NAME > /dev/null 2>&1 &
网友评论