当服务器挂起,崩溃或者性能底下时,就需要抓取服务器的线程堆栈(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
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)