jvm分析工具
jvm分析工具: jstack (查看线程)、thread dump(查看线程)、jmap (查看内存) 、 jstat (性能分析)
一、 Thread Dump
1.Thread Dump 是非常有用的诊断 Java 应用问题的工具。每一个 Java 虚拟机都有及时生成所有线程在某一点状态的 thread-dump 的能力,虽然各个 Java 虚拟机打印的 thread dump 略有不同,但是大多都提供了当前活动线程的快照,及 JVM 中所有 Java 线程的堆栈跟踪信息,堆栈信息一般包含完整的类名及所执行的方法,如果可能的话还有源代码的行数。
2.使用:
首先查找到服务器的进程号 (process id), 然后获取线程堆栈.
- ps –ef | grep java
- kill -3
注意:一定要谨慎, 一步不慎就可能让服务器进程被杀死。kill -9 命令会杀死进程。
二、jstack
1.jstack 能得到运行 java 程序的 java stack 和 native stack 的信息。可以轻松得知当前线程的运行情况。注:这个和 thread dump 是同样的结果。但是 thread dump 是用 kill -3 pid 命令,还是服务器上面少用 kill 为妙
2.使用:
- jstack [ option ] pid
3.内容:
dump 文件里,值得关注的线程状态有:
- 死锁,Deadlock(重点关注)
- 执行中,Runnable
- 等待资源,Waiting on condition(重点关注)
- 等待获取监视器,Waiting on monitor entry(重点关注)
- 暂停,Suspended
- 对象等待中,Object.wait () 或 TIMED_WAITING
- 阻塞,Blocked(重点关注)
- 停止,Parked
三、jmap
1.jmap得到运行 java 程序的内存分配的详细情况。例如实例个数,大小等
2.使用:
- jmap [ option ] pid ,查看内存分配
- map -dump:format=b,file=heap.bin pid (导出内存dump文件,据说对性能有影响,小心使用)
把内存结构全部 dump 到二进制文件中,通过 IBM 的 HeapAnalyzer 和 eclipse 的 MemoryAnalyzer 都可以分析内存结构。
四、Jstat
1.这是一个比较实用的一个命令,可以观察到 classloader,compiler,gc 相关信息。可以时时监控资源和性能
2.使用:
- -class:统计 class loader 行为信息
- -compile:统计编译行为信息
- -gc:统计 jdk gc 时 heap 信息
- -gccause:统计 gc 的情况,(同 - gcutil)和引起 gc 的事件
- -gcnew:统计 gc 时,新生代的情况
- -gcnewcapacity:统计 gc 时,新生代 heap 容量
- -gcold:统计 gc 时,老年区的情况
- -gcoldcapacity:统计 gc 时,老年区 heap 容量
- -gcpermcapacity:统计 gc 时,permanent 区 heap 容量
- -gcutil:统计 gc 时,heap 情况
五、排查问题
1.排查CPU100%的问题
- 使用 top 命令查看 cpu 占用资源较高的 PID
- 通过 jps 找到当前用户下的 java 程序 PID,jps(Java Virtual Machine Process Status Tool)是 java 提供的一个显示当前所有 java 进程 pid 的命令,适合在 linux/unix 平台上简单察看当前 java 进程的一些简单情况。
- 使用 pidstat找到 cpu 占用较高的线程 TID 。pidstat 是 sysstat 工具的一个命令,用于监控全部或指定进程的 cpu、内存、线程、设备 IO 等系统资源的占用情况。
2.ava 导致 CPU 一直满的原因
- Java 内存不够或溢出导致 GC overhead 问题,GC overhead 导致的 CPU 100% 问题; GC overhead limt exceed 检查是 Hotspot VM 1.6 定义的一个策略,通过统计 GC 时间来预测是否要 OOM 了,提前抛出异常,防止 OOM 发生。
- 死循环问题。如常见的 HashMap 被多个线程并发使用导致的死循环;
- 某些特费 CPU 的操作被长期执行。以前有个 case, 使用正则表达式去判断是不是符合某个规则,可是有些时候输入参数是一个几十 K 或更长的数据,该正则写又不好,导致 CPU 遇到这种输入,就爆掉了.
还没有评论,来说两句吧...