top
使用top主要查看各进程CPU、内存使用情况。
top -Hp pid 还可以定位到某个具体线程,测试使用发现内存那列都是一样的(都显示的进程占用的内存),而CPU是不一样的,所以top -Hp pid可以查看每个线程的CPU占用情况。
top -Hp pid命令截图
当进程CPU占用比较高时,可以查看具体哪个线程使用CPU比较高,再通过
jstack pid |grep tid的十六进制 -A 30
查看线程堆栈信息,从而定位导致CPU占用较高的代码。
jmap
jmap可以查看堆内存初始化配置信息以及堆内存的使用情况。
jmap -heap pid命令截图
我们可以使用 jmap -histo[:live] pid 查看堆内存中的对象数目、大小统计直方图,如果带上 live 则只统计活对象。
jmap -histo[:live] pid命令截图
还可以使用jmap -dump:format=b,file=name.dump pid 导出dump文件,用visualVM软件进行分析。
当发生内存溢出或老年代占用率过高,可以使用以上命令分析。
jstat
jstat -option可以监测 Java 应用程序的实时运行情况,包括堆内存信息以及垃圾回收信息,具体选项如下:
- -class:显示 ClassLoad 的相关信息;
- -compiler:显示 JIT 编译的相关信息;
- -gc:显示和 gc 相关的堆信息;
- -gccapacity:显示各个代的容量以及使用情况;
- -gcmetacapacity:显示 Metaspace 的大小;
- -gcnew:显示新生代信息;
- -gcnewcapacity:显示新生代大小和使用情况;
- -gcold:显示老年代和永久代的信息;
- -gcoldcapacity :显示老年代的大小;
- -gcutil:显示垃圾收集信息;
- -gccause:显示垃圾回收的相关信息(通 -gcutil),同时显示最后一次或当前正在发生的垃圾回收的诱因;
- -printcompilation:输出 JIT 编译的方法信息。
这里详细记录下jstat -gcutil 时间间隔(毫秒)
命令,这个命令会持续输出堆内存各个区的使用率和垃圾收集情况。
jstat -gcutil pid 时间间隔(毫秒)命令截图 - S0:Survivor S0区的内存使用率。
- S1:Survivor S1区的内存使用率。
- E:Eden区的内存使用率。
- O:老年代的内存使用率。
- P:永久代的内存使用率。
- YGC:Minor GC发生的次数。
- YGCT:Minor GC共消耗的时间(s)。
- FGC:Full GC发生的次数。
- FGCT:Full GC共消耗的时间。
- GCT:Minor GC 和 Full GC共消耗的时间。
jstack
jstack pid
经常用来查看线程的堆栈信息,通常结合top -Hp pid
或pidstat -p pid -t
来使用,比如通过top -Hp pid
定位到了CPU使用率高的线程,再使用jstack pid
可以定位CPU使用率高的代码。
网友评论