1. 搞清楚两个概念:
内存溢出 (Out Of Memory): 是指程序在申请内存时, 没有足够的内存空间供其使用, 就会出现 out of memory.
内存泄露 (Memory Leak): 是指程序在申请内存后, 无法释放已申请的内存空间.
2. 设置 OOM 时 dump heap:
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/opt/tomcat/logs
3. 设置打印 GC 信息:
-XX:+PrintGCDetails -Xloggc:/opt/tomcat/logs/gc.log
4. 查看 java 进程:
jps -v // -v 表示输出 jvm 启动时的参数
5. 线上 dump heanp, 用到了 jmp 命令:
jmap -dump:format=b,file=7680.hprof 7680 //7680 为 java 进程 ID
6. 查看 java 进程实例对象数量以及大小, 也是 jmap:
jmap -histo 7680
输出示例如下:
num #instances #bytes class name
1: 1732667 149468304 [C
2: 209826 136432064 [B
3: 364780 53321016 com.zws.beans.User
Total: 9076919 717049952
7. 获取 java 进程的线程状态:
jstack -l 7680 > 7680.stack
8. jstat 查看 Java 进程各个内存区域的使用占比情况:
jstat -gcutil 7680
示例输出:
S0 S1 E O P YGC YGCT FGC FGCT GCT
75.02 0.00 3.34 41.42 99.92 388 15.379 0 0.000 15.379
其中:
S0 S1:Survivor0,Survivor1 空间占百分比.
E:Eden 空间使用所占百分比.
O: 老年代空间使用所占百分比.
P: 永久代空间使用所占百分比.
YGC: 自从进程启动以来发生的 Minor GC 次数 (YGC 表示 Young GC).
YGCT: 自从进程启动以来发生的 Minor GC 总耗时 (秒).
FGC: 自从进程启动以来发生的 Full GC 次数.
FGCT: 自从进程启动以来发生的 Full GC 总耗时 (秒).
GCT: 自从进程启动以来所有 GC 总耗时 (秒).
9. 查看最近一次 GC 的原因:
jstat -gccause 4882
示例输出:
S0 S1 E O P YGC YGCT FGC FGCT GCT LGGC GCC
75.02 0.00 3.34 41.42 99.92 388 15.379 0 0.000 15.379 Allocation Failure No GC
其中:
LGGC: 最近一次 GC 的原因.
其他同第 8 条.
JVM 常用命令行工具学习总结
来源: http://www.bubuko.com/infodetail-2481577.html