查看原文
其他

深入理解Java虚拟机(五): JDK内置监控神器

The following article is from 微技术栈 Author 李茹钰

点击上方"淼淼之森",选择"关注"公众号

优秀文章,第一时间收到!

KS

Knowledge Sharing

知识分享

    现在是资源共享的时代,同样也是知识分享的时代,如果你觉得本文有用,希望你能将它分享,让更多的人看到。

推荐阅读

1、神站推荐

2、资源汇总整理分享

3、好用的Chrome插件推荐

4、设计模式精炼: 汇总篇

JDK内置监控神器

1 eclipseMAT

MAT是一款快速,功能丰富的Java堆分析仪,可以帮助你查找内存泄漏和减少内存消耗。可以对象大小并且生成报告。

2 JProfiler

JProfiler是一款Java的性能监控工具。可以查看当前应用的对象、对象引用、内存、CPU使用情况、线程、线程运行情况(阻塞、等待等),同时可以查找应用内存使用得热点,即:哪个对象占用的内存比较多;或者CPU热点,即:哪儿方法占用的较大得CPU资源。

3 jps

jps是jdk提供的一个查看当前Java进程的小工具。

# 命令格式:jps [options ] [ hostid ]
# [options]选项 :
# -q:仅输出VM标识符,不包括classname,jar name,arguments in main method
# -m:输出main method的参数
# -l:输出完全的包名,应用主类名,jar的完全路径名
# -v:输出jvm参数
# -V:输出通过flag文件传递到JVM中的参数(.hotspotrc文件或-XX:Flags=所指定的文件
# -Joption:传递参数到vm,例如:-J-Xms512m
# 只输出LVMID,省略主类的名称
jps -q
# 输出虚拟机进程启动时传递给主类main()函数的参数
jps -m
# 输出主类的全名,如果进程执行的是jar包,则输出jar包路径
jps -l
# 输出虚拟机进程启动时JVM参数
jps -v

4 jstack

jstack用于打印出给定的Java进程ID或core file或远程调试服务的Java堆栈信息。

jstack <pid>

5 jinfo

jinfo可以输出并修改运行时的java 进程的opts。用处比较简单,用于输出JAVA系统参数及命令行参数。

# 格式
jinfo -flags <pid>
# 查看进程2788的MaxPerm大小
jinfo -flag MaxPermSize 2788

6 jmap

打印出某个java进程(pid)内存内的所有‘对象’的情况(如:产生那些对象,及其数量)。

jmap -histo pid
jmap -histo pid>a.log
jmap -histo 9569 | head -10
# 使用eclipse打开看到jmap报告,使用eclipseMAT分析
jmap -dump:format=b,file=data.bin 3024
# 查看堆被谁占了
jmap -histo 9569 | head -10

7 jstat

# 语法格式:
# jstat -<option> [-t] [-h<lines>] <vmid> [<interval> [<count>]]
# 使用参数说明:
# options:选项,我们一般使用 -gcutil 查看gc情况
# vmid:VM的进程号,即当前运行的java进程号
# interval:间隔时间,单位为秒或者毫秒
# count:打印次数,如果缺省则打印无数次
# 使用gcutil收集进程9569的日志,每隔3s打印一次,每隔10次打印一次头信息
jstat -gcutil -h10 9569 3s
# 结果参数说明:
# S0:Heap上的 Survivor space 0 区已使用空间的百分比
# S1:Heap上的 Survivor space 1 区已使用空间的百分比
# E:Heap上的 Eden space 区已使用空间的百分比
# O:Heap上的 Old space 区已使用空间的百分比
# P:Perm space 区已使用空间的百分比
# YGC:从应用程序启动到采样时发生 Young GC 的次数
# YGCT:从应用程序启动到采样时 Young GC 所用的时间(单位秒)
# FGC:从应用程序启动到采样时发生 Full GC 的次数
# FGCT:从应用程序启动到采样时 Full GC 所用的时间(单位秒)
# GCT:从应用程序启动到采样时用于垃圾回收的总时间(单位秒)

8 jconsole

一个javaGUI监视工具,可以以图表化的形式显示各种数据,并可通过远程连接监视远程的服务器VM。用java写的GUI程序,用来监控VM,并可监控远程的VM,非常易用,而且功能非常强。命令行里打jconsole,选则进程就可以了。

9 jvisualvm

jvisualvm同jconsole都是一个基于图形化界面的、可以查看本地及远程的JAVA GUI监控工具,Jvisualvm同jconsole的使用方式一样,直接在命令行打入Jvisualvm即可启动,不过Jvisualvm相比,界面更美观一些,数据更实时。

10 jmc

11 jha/jdb

不常用

12 dmesg

用于排查:java进程自动消失
如果发现自己的java进程悄无声息的消失了,几乎没有留下任何线索,那么dmesg一发,很有可能有你想要的。

dmesg | grep -i 'pid'
sudo dmesg|grep -i kill|less

去找关键字oom_killer。找到的结果类似如下:

[6710782.021013] java invoked oom-killer: gfp_mask=0xd0, order=0, oom_adj=0, oom_scoe_adj=0
[6710782.070639] [<ffffffff81118898>] ? oom_kill_process+0x68/0x140
[6710782.257588] Task in /LXC011175068174 killed as a result of limit of /LXC011175068174
[6710784.698347] Memory cgroup out of memory: Kill process 215701 (java) score 854 or sacrifice child
[6710784.707978] Killed process 215701, UID 679, (java) total-vm:11017300kB, anon-rss:7152432kB, file-rss:1232kB

以上表明,对应的java进程被系统的OOM Killer给干掉了,得分为854。
解释一下OOM killer(Out-Of-Memory killer),该机制会监控机器的内存资源消耗。当机器内存耗尽前,该机制会扫描所有的进程(按照一定规则计算,内存占用,时间等),挑选出得分最高的进程,然后杀死,从而保护机器。剩下的,就是看看为什么内存这么大,触发了OOM-Killer了。

dmesg日志时间转换公式:
log实际时间=格林威治1970-01-01+(当前时间秒数-系统启动至今的秒数+dmesg打印的log时间)秒数

date -d "1970-01-01 UTC `echo "$(date +%s)-$(cat /proc/uptime|cut -f 1 -d' ')+12288812.926194"|bc ` seconds"


-END-

关注公众号"淼淼之森";后台回复序号“4”获取超多精彩哦。

: . Video Mini Program Like ,轻点两下取消赞 Wow ,轻点两下取消在看

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存