项目上线后,不可能有debug模式,所以会长借助一些工具帮忙分线线上的运行情况,这些运行时信息包括但不限于运行日志、异常堆栈、堆使用情况、GC情况、JVM参数情况、线程情况等。主要介绍一些常见的分析命令:
1. jps
- jps位于jdk的bin目录下,其作用是显示当前系统的java进程情况,及其id号。非常关键的一点:jps会查找当前用户权限下的所有java进程。
- jps -v 输出传递给JVM的参数
- jps -m 输出传递给Main函数的参数
2.jinfo
- jinfo -pid 输出Java运行环境的系统参数
3. jstat
- jstat位于java的bin目录下,主要利用JVM内建的指令对Java应用程序的资源和性能进行实时的命令行的监控,包括了对Heap size和垃圾回收状况的监控
jstat –class<pid> :
显示加载class的数量,及所占空间等信息jstat -compiler <pid>
显示VM实时编译的数量等信息jstat -gc <pid>
: 可以显示gc的信息,查看gc的次数,及时间 <jstat -gc 5828 250 5 表示每隔250毫秒收集一次进程5828垃圾手机情况,一共查询5次>jstat -gcutil <pid>
:统计gc信息,百分比
字段说明:
字段 | 说明 |
---|---|
NGCMN | 新生代最小容量 |
NGCMX | 新生代最大容量 |
NGC | 当前新生代容量 |
S0C | 第一个Survivor区大小 |
S1C | 第二个Survivor区的大小 |
EC | Eden区的大小 |
OGCMN | 老年代最小容量 |
OGCMX | 老年代最大容量 |
OGC | 当前老年代大小 |
OC | 当前老年代大小 |
MCMN | 最小元数据容量 |
MCMX | 最大元数据容量 |
MC | 当前元数据空间大小 |
CCSMN | 最小压缩类空间大小 |
CCSMX | 最大压缩类空间大小 |
CCSC | 当前压缩类空间大小 |
YGC | 年轻代gc次数 |
FGC | 老年代GC次数 |
4.jmap
- 主要打印Java堆内存细节快照,堆Dump是反应Java堆使用情况的内存镜像,其中主要包括系统信息、虚拟机属性、完整的线程Dump、所有类和对象的状态等。 一般,在内存不足、GC异常等情况下,就会怀疑有内存泄漏。
- jmap -heap pid 查询堆内存的使用情况
- jmap -histo pid 查看内存中对象数量和大小
- jmap -dump:format=b,file=heapDump pid 生成名字为heapDump的dump文件
5.jhat
- 一般在jmap生成dump文件后,用jhat来分析。jhat heapDump
6.jstack
- jstack用于生成java虚拟机当前时刻的线程快照。线程快照是当前java虚拟机内每一条线程正在执行的方法堆栈的集合,生成线程快照的主要目的是定位线程出现长时间停顿的原因,如线程间死锁、死循环、请求外部资源导致的长时间等待等。
7. 使用NMT分析内存使用情况
jcmd <pid> VM.native_memory detail
常见问题的确认:
1、使用jps查看进程id
2、用jstat -gc 查询GC情况
3、使用jstat -gccause 输出上次GC原因
4、用jmap -dump:format=b,file=xxx pid生成dump文件
5、用jhat等分析堆
6、用jstack分析线程情况。