jvm 性能调优、监控工具
jps、jstack、jmap、jhat、jstat、hprof
jps ——输出 jvm 运行状态信息的工具
语法格式:
jps [options] [hostid] 如果不指定 hostid 就默认是当前主机。
可选参数:
-q — 不输出类名、Jar名和传入main方法的参数
-m — 输出传入main方法的参数
-l — 输出main类或Jar的全限名
-v — 输出传入JVM的参数
jstack——某个Java进程内的线程堆栈信息
语法格式: jstack [option] <pid> (to connect to process) 可选参数: -F — 强制 dump 线程,通常用于无响应的线程信息的输出 -m — mixed mode,不仅会输出Java堆栈信息,还会输出C/C++堆栈信息(比如Native方法) -l — long listings,会打印出额外的锁信息,在发生死锁时可以用jstack -l pid来观察锁持有情况 -h or -help — 打印帮助信息 应用场景一: java进程中最耗CPU的线程问题 1、通过top -Hp pid找到线程 ID,通过 printf "%x\n"将线程ID 转为16进制值; 2、调用 jstack,grep 线程16进制值查看信息;
3、Jstack -l PID >> log.txt 将所有线程信息输入到指定文件中;
jmap——用于生成heap dump文件
语法格式: jmap [option] <pid> 可选参数 默认情况 — 打印堆内存 dump 文件内容 -heap — 显示 java 堆详细内容,包括使用的GC算法、堆配置参数和各代中堆内存使用情况 -histo — 显示堆中对象的详细信息 -histo:live — 显示堆中存活对象的详细信息 -permstat — 显示 java 堆内存中永久代类加载器统计信息 -finalizerinfo — 显示在 F-Queue 队列中等待执行 finalizer 方法的对象 -dump — 生成堆内存的转出快照 -F — -dump 没有响应时,强制生成快照 示例 jmap -histo 12158(pid) > a.log : 查看JVM堆中对象详细占用情况 jmap-histo:live 命令,强制执行 Full GC;如果几次执行后内存明显下降,则基本确认为 Direct ByteBuffer 问题 jmap -heap [pid] : 查看整个JVM内存状态,要注意的是在使用CMS GC 情况下,jmap -heap的执行有可能会导致JAVA 进程挂起 jmap -dump:format=b,file=文件名 [pid] : 导出整个JVM 中内存信息
jhat——用于生成heap dump文件,用来分析jmap生成的dump,jhat内置了一个微型的HTTP/HTML服务器,生成dump的分析结果后,可以在浏览器中查看
使用步骤 1、通过 jmap 输出堆内存的 dump 文件 2、通过 jhat 命令指定端口,即可在浏览器中查看了 打印字段含义 S0C、S1C、S0U、S1U — Survivor 0/1区容量(Capacity)和使用量(Used) EC、EU — Eden区容量和使用量 OC、OU — 年老代容量和使用量 PC、PU — 永久代容量和使用量 YGC、YGT — 年轻代GC次数和GC耗时 FGC、FGCT — Full GC次数和Full GC耗时 GCT — GC总耗时 示例 jhat -J-Xmx512m dump.hprof 主要是用来分析java堆的命令,可以将堆中的对象以html的形式显示出来,包括对象的数量,大小等等,并支持对象查询语言,默认访问:localhost:7000 jhat -port 7000 mem.dat