jvm分析工具

女爷i 2021-09-21 05:30 395阅读 0赞

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 遇到这种输入,就爆掉了.

发表评论

表情:
评论列表 (有 0 条评论,395人围观)

还没有评论,来说两句吧...

相关阅读

    相关 jvm分析工具

    > jvm分析工具: jstack (查看线程)、thread dump(查看线程)、jmap (查看内存) 、 jstat (性能分析) 一、 Thread Dump