dump使用说明

dump使用说明

  • 前言
  • 内存dump
  • 线程dump


前言

dump经常用于分析JVM的内存、CPU的占用情况,JDK也有自带的可视化工具如Java visual,但由于我使用的是阿里云的Linux服务器,没有界面,所以日常的运维都是在window下通过远程连接,在Linux输出日志,拷贝到window下,借助IBM的ha456.jar工具分析其日志。

关于ha456.jar的下载,直接点击此链接到官网后,拉到最下方,点击下载即可。


内存dump

dump在分析Java程序的使用情况时,大致分为两个模块,即内存dump和线程dump。通过内存dump进行分析,找出内存溢出或长时间使用内存很高的程序。

因为这里分析的是\Java程序,所以我们需要先列出Java有哪些进行在运行~直接输入jsp命令(配置好JDK的环境变量),可以看到当前Java运行的进程有Bootstrap启动类加载器和Jps命令。:

dump使用说明_第1张图片
接下来,我们也可以使用top 命令实时显示进程的状态,这个相当于我们window下的任务管理器,不过它有一点烦人,每5秒钟更新一次,也就是说跳来跳去的,,默认状态显示的是cpu密集型的进程。
dump使用说明_第2张图片
为了在我们分析某个进程时不让它跳来跳去,我们可以使用top -p pid 命令显示我们想要的某一进程的使用情况,如图中top -p 8731:

dump使用说明_第3张图片
图中为8731的进程的使用情况,在我们的Jps输出列表和top列表中都出现,在top列表中显示是由java COMMAND启动的,其中%MEM为4.2,说明占用系统内存为4.2%,%CPU指的是当前进程使用CPU资源百分比。

如果想进行更详细的分析,我们可以借助我们前言说的工具ha456.jar,首先在Linux中以二进制的形式输出信息,这里要注意一下,64位和32位,在输出时命令有所不同,32位没有-J-d64,这里,我们是64位的系统,所以需要加,该命令输出信息到heap.bin文件中:

官网的资料
dump使用说明_第4张图片
将heap.bin文件通过远程连接工具拷贝到window下,利用命令java -jar -Xmx3000m ha456.jar(在你的ha456的jar包的路径下使用该命令),启动工具,为了使用方便,我们可以将改命写到文本中,然后改变后缀名为bat,编程bat文件,每次启动点击即可,然后点击左上角的File,打开heap.bin即可得到相关的信息:
dump使用说明_第5张图片

这里顺便记录一下JVM调优所需要的几个参数信息:

  • -Xms 为jvm启动时分配的内存,比如-Xms200m,表示分配200M
  • -Xmx 为jvm运行过程中分配的最大内存,比如-Xms500m,表示jvm进程最多只能够占用500M内存
  • -Xss 为jvm启动的每个线程分配的内存大小,默认JDK1.4中是256K,JDK1.5+中是1M

线程dump

如果发现某个进程的CPU使用率很高,我们可以通过dump定位具体哪个线程在做哪个工作占用了过多的资源。 线程dump首先通过命令可以查看该进程下各个线程的cpu使用情况: top -Hp pid
dump使用说明_第6张图片
可以看到8748线程占用的资源比较过,接下通过命令jstack 8731找到该进行下的各个线程的堆栈状态,在它生成的信息中,每个线程都有一个nid,表示每个线程号的16进制,像这里的8748转为16进制后就是222c,用16进制表示就是0x222c,如图所示:

在这里插入图片描述
由于程序的不断运行,我们可以每隔段时间再执行一次stack命令获取thread dump(堆栈),区分两份dump是否有差别。从图中我们可以发现,8748线程一直在sleeping,出于waiting状态。

  1. RUNNABLE,线程处于执行中
  2. BLOCKED,线程被阻塞
  3. WAITING,线程正在等待

参考资料 jstack - Stack Trace

jstack更多用法
jstack定位死锁等问题

你可能感兴趣的:(JVM深入学习,dump使用说明)