jmap使用
jmap -heap pid 查看java进程的堆情况
jmap -histo pid显示堆中对象的统计信息
jmap -histo:live pid显示堆中存活对象的统计信息
jmap -dump:format=b,file=dump.hprof pid生成堆中对象的快照(含堆栈信息)
jmap -dump:live,format=b,file=dump.hprof pid 生成堆中存活对象的快照(不含堆栈信息)
-F 当-dump 没有响应时,强制生成 dump 快照
Java线程转储及线程信息
保存如下脚本为cpu_high.sh, 然后执行sh cpu_high.sh 111 2 1
#!/bin/bash #$#:表示执行脚本传入参数的个数 #${1:-3}表示第一参数,默认值3 if [ $# -ne 3 ]; then echo " 输出java程序中线程及线程转储" echo "Usage: cpu_high.sh pid count delay" echo " pid=java进程id count=采样次数, delay=采样后休眠秒数" exit 1 fi pid=${1} count=${2} delay=${3} now=`date +"%Y%m%d%H%M%S"` i=1 while [ $i -le $count ] do jstack $pid >jstack.$pid.$now.$i.log top -b -n1 -Hp $pid > threads.$pid.$now.$i.log if [ $i -lt $count ]; then sleep $delay fi let i++ echo -n "." done echo -e "\n"
Java堆dump
将如下脚本保存为heapdump.sh, 然后执行sh heapdump.sh 111 1 2
#!/bin/bash #$#:表示执行脚本传入参数的个数 #${1:-3}表示第一参数,默认值3 if [ $# -ne 3 ]; then echo " dump JAVA进程的堆" echo "Usage: heapdump.sh pid count delay" echo " pid = java进程id count = 采样次数, delay = 采样后休眠秒数" exit 1 fi pid=${1} count=${2} delay=${3} now=`date +"%Y%m%d%H%M%S"` i=1 while [ $i -le $count ] do #生成堆中对象的快照(含堆栈信息) jmap -dump:format=b,file=heapdump.$pid.$now.$i.hprof $pid if [ $i -lt $count ]; then sleep $delay fi let i++ echo -n "." done echo -e "\n"
Java堆对象统计
将如下脚本保存为heap_obj_sum.sh, 然后执行sh heap_obj_sum.sh 111 1 1
#!/bin/bash #$#:表示执行脚本传入参数的个数 #${1:-3}表示第一参数,默认值3 if [ $# -ne 3 ]; then echo " 显示Java程序堆中对象的统计信息" echo "Usage: heap_obj_sum.sh pid count delay" echo " pid=Java程序进程id count = 表示采样次数, delay = 表示采样后休眠秒数" exit 1 fi pid=${1} count=${2} delay=${3} now=`date +"%Y%m%d%H%M%S"` i=1 while [ $i -le $count ] do #生成堆中对象的快照(含堆栈信息) jmap -histo $pid > heap_obj_sum.$pid.$now.$i.log if [ $i -lt $count ]; then sleep $delay fi let i++ echo -n "." done echo -e "\n"