采集HeapDump、ThreadDump

一、Windows

1、Control + Break

转向服务器的标准输出窗口并按下Control + Break组合键, 之后需要将线程堆栈、内存堆栈信息复制到文件中。

示例还是中的示例:

了解String类的intern()方法--从Java7开始,字符串常量池从Heap空间移动到Metaspace空间

下面是heap信息:

2、jmap

1、先运行目标程序

2、查看pid

3、用jmap抓取jmap -dump:live,format=b,file=test.bin 9328

3、jstack

 

 4、JVM参数之-XX:+HeapDumpOnOutOfMemoryError(导出内存溢出的堆信息(hprof文件))见JVM参数之-XX:+HeapDumpOnOutOfMemoryError(导出内存溢出的堆信息(hprof文件))

二、UNIX/ Linux

首先查找到服务器的进程号(process id), 然后获取堆栈.

1. ps –ef | grep java

2. kill -3 <pid>

注意一定要谨慎, 一步不慎就可能让服务器进程被杀死!


JVM 自带的工具获取线程堆栈:

JDK自带命令行工具获取PID并做ThreadDump:

1. jps

2.jmap

jmap -dump:live,format=b,file=/home/appdeploy/appTest/test.bin 81301

生成的结果为:

3、jstack

[appdeploy@cnsz22vl2175 appTest]$ jstack 81301 >a.bin

将Thread Dump导入到a.bin文件

详细介绍见三、jdk工具之jstack(Java Stack Trace)

4.使用JVisualVM

Threads 标签页下的ThreadDump按钮.

5、JVM参数之-XX:+HeapDumpOnOutOfMemoryError(导出内存溢出的堆信息(hprof文件))见JVM参数之-XX:+HeapDumpOnOutOfMemoryError(导出内存溢出的堆信息(hprof文件))

6、jvisualVM通过JMX连接远程服务器,再用jvisual导出hprof文件

7、jvisualVM通过jstatd连接远程服务器,再用jvisual导出hprof文件

 

WebLogic 自带的获取 thread dump的工具:

1. webLogic.Admin 工具

a. 打开命令提示符, 通过运行<DOMAIN_HOME>/bin/setDomain.env设置相关类路径

b. 执行下面的命令

java weblogic.Admin -url t3://localhost:7001 -username weblogic -password weblogic1 THREAD_DUMP

注意: Thread Dump 会打印到标准输出, 如nohup日志或者进程窗口.

2. 使用 Admin Console

a. 登录 Admin Console , 点击对应的服务器

b. 点击Server à Monitoring àThreads

c. 点击: Dump Thread Stack 按钮

3. 使用WLST (WebLogic Scripting Tool)

connect(‘weblogic’,'weblogic1’,’t3://localhost:7001’)

cd(‘Servers’)

cd(‘AdminServer’)

threadDump()

disconnect()

exit()

注意: 线程堆栈将会保存在运行wlst的当前目录下.

4. 使用utils.ThreadDumper

用法:

C:\bea\wlserver_10.3\server\lib>java -cp weblogic.jar utils.ThreadDumper

Broadcast Thread dumps disabled: must specify weblogic.debug.dumpThreadAddr and

weblogic.debug.dumpThreadPort

Exception in thread "main" java.lang.IllegalArgumentException: Port out of range

:-1

at java.net.DatagramPacket.setPort(Unknown Source)

at java.net.DatagramPacket.<init>(Unknown Source)

at java.net.DatagramPacket.<init>(Unknown Source)

at utils.ThreadDumper.sendDumpMsg(ThreadDumper.java:124)

at utils.ThreadDumper.main(ThreadDumper.java:145)


5. 如果服务器是作为Windows服务的方式运行, 请运行下列命令:

WL_HOME\bin\beasvc -dump -svcname:service-name


其它一些获取Thread Dump的工具有jrcmd, jrmc(JRockit VM自带) ,Samurai, JProfiler等, 还可通过JMX编程的方式获取, 如JDK自带示例代码:

$JAVA_HOME\demo\management\FullThreadDump

原文地址:https://www.cnblogs.com/duanxz/p/2753619.html