Java 中怎么获取一份线程 dump 文件

Java 中怎么获取一份线程 dump 文件,第1张

当服务器挂起,崩溃或者性能底下时,就需要抓取服务器的线程堆栈(Thread Dump)用于后续的分析.

Thread dump提供了当前活动的线程的快照. 它提供了JVM中所有Java线程的栈跟踪信息

有很多方式可用于获取Thread Dump, 一些是 *** 作系统特定的命令.

*** 作系统命令获取ThreadDump:

Windows:

1. 转向服务器饥姿的标准输出窗口并按下Control + Break组合键, 之后需要将线程堆栈复制到文件

UNIX/ Linux

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

1. ps –ef  | grep java

2. kill -3 <pid>

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

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

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

1.  jps

2.jstack <pid>

使用JVisualVM:

Threads 标签页 →ThreadDump按钮

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

修改运行脚本的javaw 到java,并且添加参数-XX:+HeapDumpOnCtrlBreak。运行程序后,按ctrl+break, 就可以得到heapdump文件。-Djava.awt.headless=true -XX:+HeapDumpOnOutOfMemoryError-XX:HeapDumpPath=c:\heapdump2. solaris: 首先在运行的脚本中裤镇添加参数-XX:+HeapDumpOnCtrlBreak。利用ps -ef | grep java 找到运行程序的进程号。 或者: kill -QUIT <pid>-Djava.awt.headless=true -XX:+HeapDumpOnOutOfMemoryError 3. AIX(1) choose one cluster member, set the following before this server start:在was启动前设置下面环境变量(在启动脚本中)then start this cluster member.用set命令检查参数设胡握粗置,确保没有设置DISABLE_JAVADUMP,然后启动server (3)when you find free memory <50% when no heavy access, please run kill -3 <pid>执行kill -3 <pid>命令可以生成javacore文件和heapdump文件(pid为皮燃was java进程的id号,可以用ps -ef|grep java 查到),可以多执行几次,按照下面 *** 作进行

如果所使用的应用服务器是tomact,dump文件默认在catalina.out日志文件里;

如果不是则可以查看java环境变量设置的位置型戚返,也就知道在dump文件的位置了;

如果没有生成dump文件或者是生成错误,请按卜饥照一下几种方法来修复:

系统默认的core文件生成路径是 /var/logs,但是 /var/logs 目录并非系统自带的,系统初始安装默认自带的是/var/log,最终导致该系统出现core dump后并没能生成core文件,因此如何查询和修改系统默认的core dump文件生产路径呢?方法如下:

一. 查询core dump文件路径:

方法1:

# cat /proc/sys/kernel/core_pattern

方法2:

# /sbin/sysctl kernel.core_pattern

二. 修改core dump文件路径:

方法1:临时修改:修改/proc/sys/kernel/core_pattern文件,但/proc目录本身是动态加载的,每次系统重启都会重新加载,因此这种方法只能作为临时修改。

/proc/sys/kernel/core_pattern

例:仔猛echo ‘/var/log/%e.core.%p’ >/proc/sys/kernel/core_pattern

方法2:永久修改:使用sysctl -w name=value命令。

例:/sbin/sysctl -w kernel.core_pattern=/var/log/%e.core.%p


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12567823.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-26
下一篇 2023-05-26

发表评论

登录后才能评论

评论列表(0条)

保存