列出所有进程,找到需要的进程id【ps -ef】
-
UID: 进程所属的用户 ID。
-
PID: 进程 ID。
-
PPID: 父进程 ID。
-
C: CPU 使用率。
-
STIME: 进程启动的时间。
-
TTY: 与进程关联的终端。
-
TIME: 进程占用的 CPU 时间。
-
CMD: 启动进程的命令。
假如是搜索功能缓慢,就用查看符合条件的进程【查询包含字符串"search"的进程】【ps -ef | grep search】
查看search 服务的gc情况【查询进程id 31665 的 gc 情况】【jstat -gc 31665】
此时如果发现年轻代或老年代 gc 频率很高,那么此时就需要分析此时内存堆上的对象都是哪些
-
S0C: Survivor 0 区的当前容量(KB)。
-
S1C: Survivor 1 区的当前容量(KB)。
-
S0U: Survivor 0 区的当前使用量(KB)。
-
S1U: Survivor 1 区的当前使用量(KB)。
-
EC: Eden 区的当前容量(KB)。
-
EU: Eden 区的当前使用量(KB)。
-
OC: 老年代的当前容量(KB)。
-
OU: 老年代的当前使用量(KB)。
-
MC: 元数据区的当前容量(KB)。
-
MU: 元数据区的当前使用量(KB)。
-
CCSC: 压缩类空间的当前容量(KB)。
-
CCSU: 压缩类空间的当前使用量(KB)。
-
YGC: 年轻代垃圾回收的次数。
-
YGCT: 年轻代垃圾回收的总时间(秒)。
-
FGC: 完全垃圾回收的次数。
-
FGCT: 完全垃圾回收的总时间(秒)。
-
GCT: 垃圾回收的总时间(秒)。
jstat 这个命令主要是查看gc 、内存相关的信息【jstat -option】,以下是jstat 支持的选项
-
-class: 显示类加载器的行为统计信息。
-
-compiler: 显示 JIT 编译器的行为统计信息。
-
-gc: 显示垃圾回收的统计信息,包括各个内存池的使用情况和垃圾回收的时间。
-
-gccapacity: 显示各个内存池的容量和占用情况。
-
-gccause: 显示最近一次和当前的垃圾回收事件的原因。
-
-gcmetacapacity: 显示元数据空间的容量和占用情况。
-
-gcnew: 显示新生代垃圾回收的统计信息。
-
-gcnewcapacity: 显示新生代内存池的容量和占用情况。
-
-gcold: 显示老年代垃圾回收的统计信息。
-
-gcoldcapacity: 显示老年代内存池的容量和占用情况。
-
-gcutil: 显示垃圾回收的汇总统计信息,包括内存使用百分比和垃圾回收时间百分比。
-
-printcompilation: 显示 JIT 编译的方法统计信息。
例如用第11个举例【jstat -gcutil 31665】
-
S0: Survivor 0 区的使用百分比。
-
S1: Survivor 1 区的使用百分比。
-
E: Eden 区的使用百分比。
-
O: 老年代的使用百分比。
-
M: 元数据区的使用百分比。
-
CCS: 压缩类空间的使用百分比。
-
YGC: 年轻代垃圾回收的次数。
-
YGCT: 年轻代垃圾回收的总时间(秒)。
-
FGC: 完全垃圾回收的次数。
-
FGCT: 完全垃圾回收的总时间(秒)。
-
GCT: 垃圾回收的总时间(秒)。
查询内存中的大对象 按对象大小降序【pmap -x 31665 |sort -k 2 -r -n | head -n 100】
【这块我觉得有点鸡肋,因为这块就算看到了有大对象也不知道是哪行代码创建的】
把进程id31665 所在堆 的dump。hprof 下载下来【jmap -dump:live,format=b,file=heapdump.hprof 31665】
dump.hprof 可以用以下工具分析
用在线网站分析Brilliant Graphs, metrics and java heap dump analysis anti-patterns reported
用jdk 自带的
idea里的【先在插件里安装jprofiler】
eclipse里也有【此处省略,因为我不用eclipse】
死锁排查:
查看进程中各个线程状态和代码行数【jstack 31665】
可以看出哪行代码造成了死锁问题
这个命令一打印就打印一堆,眼睛看不过来
解决办法:将线程堆栈跟踪信息保存到 thread_dump.txt
文件中。
查找所有处于 BLOCKED
状态的线程,并统计每个线程等待的锁的数量,输出前 10 个。
[root@beideng-nj-qa-java-test-03 ~]# jstack 31665 > thread_dump.txt
[root@beideng-nj-qa-java-test-03 ~]# grep "waiting for monitor entry" thread_dump.txt | awk '{print $1}' | sort | uniq -c | sort -nr | head -n 10
后续继续补充其他命令。。。记得点赞收藏