java常用监控命令及工具

前面几篇文章我们介绍了关于java的内存机构以及优化参数。但是除此之外,我们在故障排查中,以及优化的时候。还需要监控些java的一些信息。这篇文章主要是记录关于java的内存监控方面的内容。主要从是java的堆内存,堆线程,gc回收方面,介绍几个工具。内容不可能面面俱到,意在知道有这么个工具。日后需要时,会着重描述某工具的详细用法。
ok,废话少说。直接来干货。
堆内存
     heap dump文件是一个二进制文件,它保存了某一时刻JVM堆中对象使用情况。HeapDump文件是指定时刻的Java堆栈的快照,是一种镜像文件。Heap Analyzer工具通过分析HeapDump文件,哪些对象占用了太多的堆栈空间,来发现导致内存泄露或者可能引起内存泄露的对象。
1.获取heap dump文件
jps -ml 查看
执行以下命令:jmap -dump:format=b,file=heap.hprof pid
这样就会在当前目录下生成heap.hprof文件,这就是heap dump文件。

dump文件的分析,如果是比较小的文件(一般都不小)。我们可以使用自带的jhat来分析。否则的话,我就需要借助第三方的工具比如eclipse MAT,或者visual VM.
线程内存
     thread dump文件主要保存的是java应用中各线程在某一时刻的运行的位置,即执行到哪一个类的哪一个方法哪一个行上。thread dump是一个文本文件,打开后可以看到每一个线程的执行栈,以stacktrace的方式显示。通过对thread dump的分析可以得到应用是否“卡”在某一点上,即在某一点运行的时间太长,如数据库查询,长期得不到响应,最终导致系统崩溃。单个的thread dump文件一般来说是没有什么用处的,因为它只是记录了某一个绝对时间点的情况。比较有用的是,线程在一个时间段内的执行情况。
两个thread dump文件在分析时特别有效,困为它可以看出在先后两个时间点上,线程执行的位置,如果发现先后两组数据中同一线程都执行在同一位置,则说明此处可能有问题,因为程序运行是极快的,如果两次均在某一点上,说明这一点的耗时是很大的。通过对这两个文件进行分析,查出原因,进而解决问题。
jstack

例如:

jstat

参数解释:

具体参数:


1. 很明显从上图,可以看到发生了young gc。
jstat -gcnew -h3 pid 250
-h2:每隔三行输出一次列表头; pid:进程号; 250: interval采样间隔,ms; count2,表示打印2次

以上输出表明:
1. S0U: survivor space 0 utilization
DSS: desired survivor Size
TT: tenuring threshold 阀值, 用于控制对象在新生代存活的最大次数

-t:在第一列输出时间戳; 21891:进程号; 250: 采样间隔ms;3 采样次

以上输出表明:

jstat -printcompilation pid: 当前VM执行的信息。

每1000毫秒打印一次,一共打印5次,还可以加上-h3每三行显示一下标题。

下面在介绍2个图形化工具:
Sun主推的VisualVM:因此如果是使用的sun jdk。我们直接直接调用。如果用的openjdk,则可以下载使用:
地址:https://visualvm.github.io/
下面来看一看这个工具的强大:
它包括了内存,CPU,线程,内存使用率的的监控。
直接在命令行输入:
#visualvm

除此之外我们还可以通过安装插件来,监控比如GC问题。

具体用法还需要细细研究。这里面就不多说了。下面在介绍一个比较老的,但是在openjdk可以直接使用的图形化工具:
jconsole
这个工具也是比较的强大,可以监控class,内存,线程等。但是相比visual VM就比较简陋了。如果有条件的话,还是建议使用visual vm。

OK,这一片之后。对java的了解基本就有个大概了。后面如果还有好的发现,还会继续记录的。

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: