1、查看 Java 进程
jps
2、jrockit dump 操作
jrcmd <pid> hprofdump filename=/test.hprof
3、jstack dump 线程栈信息
jstack <pid> > test.dump
参数:
jstack [-l] <pid>: 连接到一个运行中的进程
jstack -F [-m] [-l] <pid>: 连接到一个挂起的进程
jstack [-m] [-l] <executable> <core>: 连接到核心文件
jstack [-m] [-l] [server_id@]<remote server IP or hostname>: 连接到远程调试服务
4、jmap dump 堆内存
jmap [option] <pid>: 连接到正在运行的进程
jmap [option] <executable <core>: 连接到核心文件
jmap [option] [server_id@]<remote server IP or hostname>: 连接到远程调试服务
option:
无参数: 类似 Solaris pmap,查看虚拟机内存使用情况
jmap 8888
-heap: 打印 heap 的概要信息,GC 使用的算法,heap 的配置及 JVM 堆内存的使用情况
jmap -heap 8888
-histo[:live]: 打印 Java 堆对象的直方统计信息,live 参数加上只统计活的对象
jmap -histo:live 8888
jmap -histo 8888 | head 10
-clstats: 打印类加载器的统计情况
jmap -clstats 8888
-finalizerinfo: 打印正等候回收的对象的信息
jmap -clstats 8888
-dump:<dump-options>: 使用 hprof 二进制形式,输出 jvm 的 heap 到文件,live 子选项可选只输出活的对象到文件
jmap -dump:live,format=b,file=heap.bin 8888
jmap -dump:format=b,file=heap.hprof 8888
-F: 强制 dump,-dump 和 -histo 的 live 子参数无效
jmap -heap -F 8888
-J<flag>: 传递参数到 JVM 运行系统
jmap -J-Xmx512m 8888
5、获取堆信息的 3 种方式
jmap -dump:live,format=b,file=heap.bin 8888
jmap -dump:format=b,file=heap.hprof 8888
kill -3 <pid>
增加 JVM 启动参数
-XX:+HeapDumpBeforeFullGC
-XX:HeapDumpPath=/dump
6、找到占用 CPU 过高的线程,分析
top
定位到占用 CPU 高的进程 PID
top -H -p <pid> 或者 ps -mp <pid> -o THREAD,tid,time | sort -rn
查看对应进程的哪个线程占用 CPU 过高
printf "%x" tid
将需要的线程 ID 转换为 16 进制
jstack pid > pid.txt
jstack pid |grep tid -A 30
导出 CPU 占用较高的进程的线程栈,用 16 进制 tid 在 pid.txt 查找;或打印线程的栈信息
7、jhat,分析 java 的堆,并启动一个 web server,可以将堆中对象的数量,大小等信息以 html 的形式显示出来,并支持对象查询语言。因占有大量内存,一般不在服务器上执行使用
jhat -J-Xmx512m <heap dump file>
http://ip:7000/,查看 html
执行对象查询语句 Object Query Language:select s from java.lang.String s where s.count > 100
8、jstat,查看堆内存各部分的使用量、垃圾回收、类编译、加载的情况
ConstXiong 备案号:苏ICP备16009629号-3