常用参数设置
1 | java -Xms512m -Xmx512m -Xmn200m -Xss128k -Xloggc:/app-gc.log -XX:+PrintHeapAtGC -XX:+PrintGCDetails -jar /app.jar |
生产环境Xms和Xmx设置为相同,可有效避免扩容触发GC。
Xmx 和 Xms设置为老年代存活对象的3-4倍,即FullGC之后的老年代内存占用的3-4倍。
年轻代的内存大小设置为老年代存活对象的1-1.5倍。
老年代的内存大小设置为老年代存活对象的2-3倍。
Sun官方建议年轻代的大小为整个堆的3/8左右,所以按照上述设置的方式,基本符合Sun的建议。
GC日志分析(通过分析GC日志,确定程序要分配的合理内存大小)
可在程序运行时打印GC日志,稳定运行一段时间后,分析GC日志中的内存详细,来进行合理的内存分配。
-Xloggc:gc.log
如果使用该参数-Xloggc则默认开启如下两个参数 -XX:+PrintGC -XX:+PrintGCTimeStamps
,打印的GC日志格式如下:
1 | 0.318: [GC (Allocation Failure) 61805K->9849K(256000K), 0.0041139 secs] |
0.138
表示从jvm启动到该次GC时程序运行的秒数
GC
表示是一次YGC(Young GC)
Allocation Failure
表示是失败的类型
61805K->9849K(256000K)
回收前的堆大小->回收后的堆大小(分配的堆总大小)
0.0041139 secs
表示这次GC总计所用的时间
-XX:+PrintGCDetails
打印详细的GC日志,格式如下:
1 | [GC (Allocation Failure) [PSYoungGen: 53248K->2176K(59392K)] 58161K->7161K(256000K), 0.0039189 secs] [Times: user=0.02 sys=0.01, real=0.00 secs] |
GC
表示是一次YGC(Young GC)
Allocation Failure
表示是失败的类型
PSYoungGen
表示年轻代大小
53248K->2176K
表示年轻代占用从53248K降为2176K,59392K表示年轻带的总大小
58161K->7161K
表示整个堆占用从53248K降为2176K,256000K表示整个堆的大小
0.0039189 secs
表示这次GC总计所用的时间
[Times: user=0.02 sys=0.01, real=0.00 secs]
分别表示,用户态占用时长,内核用时,真实用时。
-XX:+PrintGCTimeStamps
如果加上-XX:+PrintGCTimeStamps
那么日志的最前面多了一个时间戳: 如:1.963, 表示从JVM启动到打印GC时刻用了1.963秒。
-XX:+PrintGCDateStamps
如果加上-XX:+PrintGCDateStamps
那么日志的最前面多了一个日期时间: 如:2019-03-05T16:56:15.108+0800, 表示打印GC的时刻的时间是2019-03-05T16:56:15.108+0800。+0800表示是东8区。
-XX:+PrintHeapAtGC
打印GC前后的堆内存使用情况,格式如下:
1 | {Heap before GC invocations=0 (full 0): |
invocations
表示GC的次数,每次GC增加一次
Heap before GC invocations=1
表示是第1次GC调用之前的堆内存状况
Heap after GC invocations=1
表示是第1次GC调用之后的堆内存状况
(full 0)
表示已进行了0次 full GC
GC日志分析其它参考:https://www.cnblogs.com/jalja365/p/12144938.html
调整linux最大线程数
1 | echo 100000 > /proc/sys/kernel/threads-max |
查看java进程的PID
1 | jps -l |
NMT常用命令【java本地内存追踪】
注:开启NMT会有5%-10%的性能损耗
在启动命令中第一个参数位置设置-XX:NativeMemoryTracking=detail
,必须是第一个,否则不生效。
然后在程序启动成功后,获取进程的 pid 然后执行以下命令:
1 | jcmd <pid> VM.native_memory detail |
pmap常用命令【查看进程的内存映像信息】
1 | pmap -x pid |
jstack常用命令【生成线程转储日志】
1 | jstack <pid> |
jmap常用命令【生成堆转储日志】
1 | jmap -dump:live,format=b,file=生成文件名.bin <pid> |
参数查询
1 | # 查看jvm所有可以设置的参数和当前值 |
参数设置
以下参数可以在环境变量 JAVA_TOOL_OPTIONS
中进行设置,也可以运行时指定。在环境变量中进行设置,会应用到所有jvm实例。运行时指定只对当前运行的jvm实例有效。(多个参数用空格隔开)
1 | #jvm设置容器感知 |
jstat常用命令【查看内存统计】
格式:jstat [-命令选项] [pid] [间隔时间/毫秒] [查询次数]
1 | # 垃圾回收统计 |
以下示例,假设java线程的 pid 为 2060
1 |
|
jvm故障分析及性能优化相关参考资料
jstat命令详解
https://www.jianshu.com/p/123079b47670
https://www.jianshu.com/p/70b94976dd1e
https://www.cnblogs.com/sxdcgaq8080/p/11089841.html
java命令更多运行参数
https://docs.oracle.com/javase/8/docs/technotes/tools/unix/java.html#BABHDABI
(完)