JVM可以用到的一些工具命令
开启GC日志
-XX:+PrintGC -Xloggc:/log/gc-%t.log -XX:+PrintGCDetails -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=
GC日志相关参数: 参考
参数 | 作用 |
---|---|
-XX:+PrintGC | 开启GC日志 |
-Xloggc:/data/log/gc-%t.log | 指定日志文件(%t:YYYY-MM-DD_HH-MM-SS) |
-XX:+PrintGCDetails | 输出GC详细信息 |
-XX:+PrintGCDateStamps | 每条日志前的时间戳(格式化的系统时间字符串) |
-XX:+PrintGCTimeStamps | 每条日志前的时间戳 |
-XX:+UseGCLogFileRotation | 开启循环分割 |
-XX:NumberOfGCLogFiles=5 | GC log 文件数,达到上限会删除第一个 |
GCLogFileSize=20M | 单个GC log 文件最大容量 |
- 不建议循环分割日志,建议输出单个文件,通过数据采集到日志平台;
命令
- jps:找到JVM进程 PID;
- top:查看进程运行详情:
- 查看进程下的线程详情:
- top:top -Hp [进程id]:显示当前进程下所有线程的Id和内存、CPU使用情况;
- ps:输出进程下所有线程及CPU使用情况 ps H -eo pid, tid, %cpu | grep [进程id]
- top:
- 获取线程堆栈详情:jstack [tid]
- jstack -l [PID] >/tmp/log.txt输出到文件;
- 输出的线程详情中的nid,通常为十六进制,需要将tid换算成十六进制;
- printf '%x\n' [pid]:10进制转16禁止;
- jmap:查询某一时刻的内存占用情况
- jmap -heap [pid]
- jmap -histo [pid] > jvm.txt:获取详细的对象内存占用情况
num #instances #bytes class name ---------------------------------------------- 351: 10 160 com.snippet.xxx.Task 370: 3 144 org.j.p.e.s.h.NodeTestTask 474: 3 72 org.j.p.e.s.h.NodeTestTask$DefaultDynamicTestExecutor 577: 3 48 org.j.p.e.s.h.NodeTestTask$$Lambda$212/825658265
Athas
无论是开发还是生产都很有用;
TODO