Thread Dump/线程转储
Thread Dump中包含下列信息:
- 所有JVM中启动了但是未结束的Thread列表;
- 每个Thread当前所处的状态及其调用栈(Stack Trace);
- JVM内部是否出现死锁(Deadlock);
基于Thread Dump信息可以确认JVM当前的执行状态,Thread Dump信息常见的收集方法包括:
- 使用jvisualvm:在所有平台上,当可以通过jvisualvm监控JVM运行时,可以直接在jvisualvm中进行Thread Dump,请参见jvisualvm的说明;
- Windows平台:在JVM Console(比如Tomcat启动时的后台窗口)下按下组合键Ctrl-Break,Console中将打印Thread Dump信息。当Console的缓冲区不够大时可能无法显示全部信息,需要增大Console的缓冲区;
- Unix/Linux平台:
先找到对应的JVM进程号(pid):ps –ef|grep java kill -3 (JVM进程号):此时Thread Dump信息将输出到JVM Console中。此命令不会终止JVM运行,只是输出Thread Dump信息;
Java Heap Dump/堆转储
JVM Heap Dump的方法与JVM密切相关,Java 6+版本的SUN/Oracle HotSpot JVM支持下列方式生成Heap Dump:
基于JVM事件:当JVM运行过程中出现OutOfMemoryError时自动Heap Dump,这也是生产系统中最可行的Heap Dump生成方法。涉及参数包括:
-XX:+HeapDumpOnOutOfMemoryError:当内存溢出时进行Heap Dump,默认在Java进程的“当前目录”下生成类似于“java_pid1340.hprof”形式的文件。可以用-XX:HeapDumpPath控制生成文件的位置;
-XX:HeapDumpPath=path:设置OutOfMemoryError时JVM生成Heap Dump文件的位置。此参数默认值为“./java_pid%p.hprof”,其中“%p”代表Java进程的PID(Process ID,进程标识),所以会在Java进程的当前目录下生成包含PID的.hprof文件;
交互式Heap Dump:在JVM运行中,以交互式方式获取Heap Dump,通常用于开发调试阶段定位问题,生产环境还是建议基于JVM事件进行Heap Dump,方式包括:
- 使用jvisualvm:在所有平台上,当可以通过jvisualvm监控JVM运行时,可以直接在jvisualvm中进行Heap Dump,请参见jvisualvm的说明;
- 使用JDK中的jmap工具:jmap -dump[live,]format=b,file=filename pid
- 使用OS功能:在Linux中,使用“无害”的 gcore 命令或破坏性的“kill -6”或“kill -11”命令来生成一个内核文件。然后,使用 jmap 从内核文件中提取一个堆转储文件:jmap -dump:format=b,file=heap.hprof path_to_java_executable_core;
- 使用 Ctrl+Break:如果运行的应用程序设置了-XX:+HeapDumpOnCtrlBreak命令行选项,那么在通过控制台发出Ctrl+Break事件或SIGQUIT(通常通过kill -3生成),那么会生成一个HPROF格式的转储文件和一个线程Dump。有一些版本不支持这个选项,那么在遇到这些情况时可以尝试使用:-Xrunhprof:format=b,file=heapdump.hprof。并不推荐使用这种方式,一些HotSpot版本不支持此参数,建议使用上述其他交互式方式。
GC信息
GC参数在不同JVM的或不同JVM版本中均有不同,但一般能够支持下列参数,系统运行时可以设置GC日志文件以收集GC信息供后续分析:
l -Xloggc:gc.log:指定将gc的信息输出到gc.log中;
l -verbose:gc:输出详尽的GC信息,通常verbose都只能用于开发调试环境,而不应该用于生产环境;
l -XX:+PrintGC:输出GC的简要信息;
l -XX:+PrintGCDetails:GC的详细信息;
l -XX:+PrintGCTimeStamps:GC的时间信息;
l -XX:+PrintGCApplicationStoppedTime:GC造成的应用暂停的时间;
l -XX:+PrintTenuringDistribution:
GC信息可以提供简要的GC运行过程信息,但不太容易基于GC信息判断JVM有什么异常状态,因此GC信息收集方法仅供参考。