java包中提供了很多监控JVM的工具类,作为java程序员必须得掌握常用的几个工具,下面是几个常用的JVM性能监控与故障处理工具的介绍与使用。

1、jstack

该命令用于生成当前时刻虚拟机的线程快照,可以用于定位线程出现长时间停顿的原因,包括死锁、死循环、超时等待等。

jstack命令格式:

jstack [option] vmid

vmid可以通过ps -ef|grep java命令得到,第二个参数的PID值就是vmid。

option的可选值:

-F  当正常输出的请求不被响应时,强制输出线程堆栈

-l    除堆栈外,显示关于锁的附加信息

-m  如果调用到本地方法的话,可显示C/C++的堆栈

查询示例:

1.1 jstack -l 18614

控制台输出的部分结果:

1.2 jstack -m 18614

2、jstat

该命令用于监视虚拟机各种运行状态信息,包括类装载、内存、垃圾回收、JIT编译等数据,是运行期定位JVM性能问题的首选工具。

jstat命令格式:

jstat [option vmid [interval[s|ms] [count]] ]

interval:查询间隔(ms单位),count:查询次数,若忽略这2个参数,则只查询一次。

option为用户需要查询的虚拟机信息,包括类装载、GC、运行期编译状态等。可选项如下:

-class    监视类装载、卸载数量、总空间及类装载所耗费的时间
-gc    监视java堆状况,包括Eden区、两个survivor区、老年代、永久代等的容量、已用空间、GC时间合计等信息
-gccapacity    监视内容与-gc基本相同,但输出的主要关注java堆各个区域使用到的最大、最小空间
-gcutil    监视内容与-gc基本相同,但输出的主要关注已使用空间占总空间的百分比
-gccause    与-gcutil功能一样,但是会额外输出上一次GC产生的原因
-gcnew    监视新生代GC状况
-gcnewcapacity    监视内容与-gcnew基本相同,输出主要关注使用到的最大、最小空间
-gcold    监视老年代GC状况
-gcoldcapacity    监视内容与-gcold基本相同,输出主要关注使用到的最大、最小空间
-gcpermcapacity    输出永久代使用到的最大、最小空间
-compiler    输出JIT编译器编译过的方法、耗时等信息
-printcompilation    输出已被JIT编译的方法

示例:

2.1 jstat -gc 18614 200 10   每200毫秒查询一次进程PID为18614的垃圾收集情况,一共查询10次。

S0C    S1C    S0U    S1U      EC       EU        OC         OU       MC     MU    CCSC   CCSU   YGC     YGCT    FGC    FGCT     GCT
33792.0 42240.0 806.7   0.0   171264.0 162460.8  61440.0    30525.4   25240.0 24905.6  0.0    0.0       24    0.338   3      0.239    0.576
33792.0 42240.0 806.7   0.0   171264.0 162460.8  61440.0    30525.4   25240.0 24905.6  0.0    0.0       24    0.338   3      0.239    0.576
33792.0 42240.0 806.7   0.0   171264.0 162460.8  61440.0    30525.4   25240.0 24905.6  0.0    0.0       24    0.338   3      0.239    0.576
33792.0 42240.0 806.7   0.0   171264.0 162460.8  61440.0    30525.4   25240.0 24905.6  0.0    0.0       24    0.338   3      0.239    0.576
33792.0 42240.0 806.7   0.0   171264.0 162460.8  61440.0    30525.4   25240.0 24905.6  0.0    0.0       24    0.338   3      0.239    0.576
33792.0 42240.0 806.7   0.0   171264.0 162460.8  61440.0    30525.4   25240.0 24905.6  0.0    0.0       24    0.338   3      0.239    0.576
33792.0 42240.0 806.7   0.0   171264.0 162460.8  61440.0    30525.4   25240.0 24905.6  0.0    0.0       24    0.338   3      0.239    0.576
33792.0 42240.0 806.7   0.0   171264.0 162460.8  61440.0    30525.4   25240.0 24905.6  0.0    0.0       24    0.338   3      0.239    0.576
33792.0 42240.0 806.7   0.0   171264.0 162460.8  61440.0    30525.4   25240.0 24905.6  0.0    0.0       24    0.338   3      0.239    0.576
33792.0 42240.0 806.7   0.0   171264.0 162460.8  61440.0    30525.4   25240.0 24905.6  0.0    0.0       24    0.338   3      0.239    0.576

查询结果的标题列含义:

S0C:当前Survivor0区空间大小(kb);S1C:当前Survivor1区空间大小(kb)

S0U:当前Survivor0区空间使用量(kb);S1U:当前Survivor1区空间使用量(kb)

EC:当前Eden区空间大小(kb);EU:当前Eden区空间使用量(kb)

OC:当前Old区空间大小(kb);OU:当前Old区空间使用量(kb)

MC:方法区空间大小(kb);MU:方法区空间使用量(kb)

CCSC:压缩类空间大小(kb);CCSU:压缩类空间空间使用量(kb)

YGC:Young GC次数;YGCT:Young GC耗时

FGC:Full GC次数;FGCT:Full GC耗时

GCT:GC总耗时

2.2 jstat -gcutil 18614

  S0     S1     E      O      M     CCS    YGC     YGCT    FGC    FGCT     GCT   2.39   0.00 100.00  49.68  98.68      -     24    0.338     3    0.239    0.576

说明:Survivor0区使用了2.39%的空间,Survivor1区使用了0.00%的空间,Eden区使用了100%的空间,Old区使用了49.68%的空间,方法区使用了98.68的空间。程序运行以来,Young GC发生了24次,耗时0.338秒,Full GC发生了3次,耗时0.239秒,所有GC总耗时0.576秒。

2.2 jstat -class 18614

Loaded  Bytes  Unloaded  Bytes     Time   5554  6350.0        0     0.0       7.93

说明:程序装载了5554个类,共6350字节,卸载了0个类,共0个字节,类装载耗时7.93秒。

 2.3 jstat -gcnew 18614

S0C    S1C    S0U    S1U   TT MTT  DSS      EC       EU     YGC     YGCT
41216.0 1024.0    0.0  798.2  9  15 41216.0 164096.0   5723.0     25    0.342

2.4 jstat -gcold 18614

MC       MU      CCSC     CCSU       OC          OU       YGC    FGC    FGCT     GCT   25368.0  24912.1      0.0      0.0     61440.0     30525.4     25     3    0.239    0.580

2.5 jstat -compiler 18614

Compiled Failed Invalid   Time   FailedType FailedMethod7018      1       0    21.29          1 com/mysql/jdbc/AbandonedConnectionCleanupThread run

说明:JIT编译器编译成功方法7018个,失败1个,无效0个,耗时21.29秒,失败类型为1,失败的方法为AbandonedConnectionCleanupThread类的run方法。

3、jps(JVM Process Status Tools)
jps是参照Unix系统的取名规则命名的,而他的功能和ps的功能类似,可以列举正在运行的饿虚拟机进程并显示虚拟机执行的主类以及这些进程的唯一ID(LVMID,对应本机来说和PID相同),他的用法如下:

jps [option] [hostid]其中hostid默认为本机,而option选项包含以下选项Option    Function
-q    只输出LVMID
-m    输出JVM启动时传给主类的方法
-l    输出主类的全名,如果是Jar则输出jar的路径
-v    输出JVM的启动参数

4、jstat(JVM Statistics Monitoring Tools)
jstat主要用于监控虚拟机的各种运行状态信息,如类的装载、内存、垃圾回收、JIT编译器等,在没有GUI的服务器上,这款工具是首选的一款监控工具。其用法如下:

jstat [option vmid [interval [s|ms] [vount] ] ]

参数interval和count分别表示查询间隔和查询次数,如每1毫秒查询一次进程20445的垃圾回收情况,监控20次,命令如下所示:

jstat –gc 20445 1 20

相关的输出参数介绍可参照官方的说明(注:网址链接请点击此处)

选项option代表用户需要查询的虚拟机的信息,主要分为3类:类装载、垃圾回收和运行期的编译情况,具体如下表所示:

Option    Function
-class    监视类的装载、卸载数量以及类的装载总空间和耗费时间等
-gc    监视Java堆,包含eden、2个survivor区、old区和永久带区域的容量、已用空间、GC时间合计等信息
-gccapcity    监视内容与-gc相同,但输出主要关注Java区域用到的最大和最小空间
-gcutil    监视内容与-gc相同,但输出主要关注已使用空间占总空间的百分比
-gccause    与-gcutil输出信息相同,额外输出导致上次GC产生的原因
-gcnew    监控新生代的GC情况
-gcnewcapacity    与-gcnew监控信息相同,输出主要关注使用到的最大和最小空间
-gcold    监控老生代的GC情况
-gcoldcapacity    与-gcold监控信息相同,输出主要关注使用到的最大和最小空间
-gcpermcapacity    输出永久带用到的最大和最小空间
-compiler    输出JIT编译器编译过的方法、耗时信息
-printcompilation    输出已经被JIT编译的方法

5、jinfo(JVM configuration Info for Java)
Jinfo的作用是实时查看虚拟机的各项参数信息jps –v可以查看虚拟机在启动时被显式指定的参数信息,但是如果你想知道默认的一些参数信息呢?除了去查询对应的资料以外,jinfo就显得很重要了。jinfo的用法如下:

Jinfo [option] pid如 jinfo –sysprops {pid}

6、jmap(JVM Memory Map for Java)
jmap用于生成堆快照(heapdump)。当然我们有很多方法可以取到对应的dump信息,如我们通过JVM启动时加入启动参数 –XX:HeapDumpOnOutOfMemoryError参数,可以让JVM在出现内存溢出错误的时候自动生成dump文件,亦可以通过-XX:HeapDumpOnCtrlBreak参数,在运行时使用ctrl+break按键生成dump文件,当然我们也可以使用kill -3 pid的方式去恐吓JVM生成dump文件。jmap的作用不仅仅是为了获取dump文件,还可以用于查询finalize执行队列、Java堆和永久带的详细信息,如空间使用率、垃圾回收器等。其运行格式如下:

jmap [option] vmipOption的信息如下表所示Option    Function
-dump    生成对应的dump信息,用法为-dump:[live,]format=b,file={fileName}
-finalizerinfo    显示在F-Queue中等待的Finalizer方法的对象(只在linux下生效)
-heap    显示堆的详细信息、垃圾回收器信息、参数配置、分代详情等
-histo    显示堆栈中的对象的统计信息,包含类、实例数量和合计容量
-permstat    以ClassLoder为统计口径显示永久带的内存状态
-F    当虚拟机对-dump无响应时可使用这个选项强制生成dump快照
示例:jmap -dump:format=b,file=heap.dump 20445

7、jhat(JVM Heap Analysis Tool)
jhat是用来分析dump文件的一个微型的HTTP/HTML服务器,它能将生成的dump文件生成在线的HTML文件,让我们可以通过浏览器进行查阅,然而实际中我们很少使用这个工具,因为一般服务器上设置的堆、栈内存都比较大,生成的dump也比较大,直接用jhat容易造成内存溢出,而是我们大部分会将对应的文件拷贝下来,通过其他可视化的工具进行分析。启用法如下:

jhat {dump_file}

执行命令后,我们看到系统开始读取这段dump信息,当系统提示Server is ready的时候,用户可以通过在浏览器键入http://ip:7000进行查询。

8、jstack(JVM Stack Trace for java)
jstack用于JVM当前时刻的线程快照,又称threaddump文件,它是JVM当前每一条线程正在执行的堆栈信息的集合。生成线程快照的主要目的是为了定位线程出现长时间停顿的原因,如线程死锁、死循环、请求外部时长过长导致线程停顿的原因。通过jstack我们就可以知道哪些进程在后台做些什么?在等待什么资源等!其运行格式如下:

jstack [option] vmid

相关的option和function如下表所示

Option    Function
-F    当正常输出的请求不响应时强制输出线程堆栈
-l    除堆栈信息外,显示关于锁的附加信息
-m    显示native方法的堆栈信息

参考:《深入理解Java虚拟机》---周志明 著

Linux下的Java虚拟机性能监控常用命令相关推荐

  1. Oracle性能监控常用命令

    Oracle性能监控常用命令 --监控事例的等待 select event,        sum(decode(wait_Time, 0, 0, 1)) "Prev",      ...

  2. java虚拟机性能监控调优及原则

    转载自 https://www.cnblogs.com/thingk/p/6840585.html 摘抄 http://uule.iteye.com/blog/2114697 一.JVM内存模型及垃圾 ...

  3. linux性能监控常用命令

    概述 我们在linux下,如果想要监控服务器性能.我们必须掌握以下常用的指标查看命令. ps pstree top free vmstat sar ps ps命令能给出当前系统中进程的快照.下面我们列 ...

  4. Java虚拟机性能监控与调优实战

    Java虚拟机的内存结构,区别于侧重于多线程的Java内存模型(Java Memory Model) 但在此之前,我们该思考一下:JVM的内存结构为什么要这样划分? 我认为主要是依据于不同数据的更新频 ...

  5. ​Linux下查看日志用到的常用命令

    面试中问你查看日志的命令,可不能只说tail,cat,more 首选,如何查看日志: 很多初级测试人员,在进行执行测试用例这个步骤时,发现bug,不能更加的准确去定位bug,在这样的情况下就可以打开L ...

  6. Linux下查看日志用到的常用命令

    杀僵尸进程 部分程序员,肯定喜欢下面命令: ps -ef | grep java (先查java进程ID) kill -9  PID(生产环境谨慎使用) kill.killall.pkill命令的区别 ...

  7. linux下mkdir头文件_Linux部分常用命令学习记录

    Linux部分常用命令 ls 显示目标列表 ls -a 显示所有档案及目录(ls内定将档案名或目录名称为"."的视为影藏,不会列出): ls -l 以长格式显示目录下的内容列表.输 ...

  8. Linux下安装DB2数据库步骤及常用命令

    前言: 最近有些项目在Linux下使用的是IBM的DB2数据库,感觉没MySQL那样容易了解深入,可能是DB2数据库更倾向于商业化,没MySQL那样开源,相关DB2的资源网上没MySQL那样普及,至于 ...

  9. Linux下MQ安装步骤及MQ常用命令

    文章转自: http://www.cnblogs.com/Bob-FD/p/3836780.html?utm_source=tuicool&utm_medium=referral 如有不全的, ...

  10. Linux下SVN的安装及SVN常用命令

    SVN的介绍 SVN是一个开源的版本控制系統, svn版本管理工具管理随时间改变的各种数据.这些数据放置在一个中央资料档案库(repository) 中. 这个档案库很像一个普通的文件服务器,它能记住 ...

最新文章

  1. GirdView的文本属性对象省略溢出标记设置
  2. » 欄位太小以致於無法接受您試圖加入的資料數量
  3. 音频编码标准发展现状
  4. xshell linux托文件夹,Xshell拖拽文件到linux(rz和sz命令用法详解)
  5. 爬虫总结(一)-- 爬虫基础 python实现
  6. javascript 事件知识集锦
  7. [SDOI2006]保安站岗 树dp
  8. oracle merge
  9. 七年也扶不起的苹果 Siri
  10. 微信小程序云开发教程-微信小程序的JS基础-this关键字
  11. Python实战项目7个有趣的小游戏
  12. bp神经网络的算法步骤,BP神经网络算法流程图
  13. python pyhook_python中使用pyhook实现键盘监控的例子
  14. php摇骰子源码,HTML5 掷骰子游戏 源码下载
  15. matlab 求隐含波动率,matlab求解资产隐含波动率及无风险利率初探.doc
  16. 【人在运维囧途_14】打扫干净屋子再请客
  17. Java项目:ssm教务管理系统
  18. AP 产品成本计算与传统成本计算
  19. Steven Pu:Taraxa化零为整,放大零散数据真正价值!
  20. 十大最佳 Linux 服务器发行版

热门文章

  1. 18. 分支管理策略
  2. css3中3d旋转中rotatex,rotatey,rotatez的旋转正方向
  3. .net core 介绍好文章
  4. 领扣(LeetCode)七进制数 个人题解
  5. java基础源码 (2)--StringBuilder类
  6. cassandra 3.x官方文档(5)---探测器
  7. NSArray的排序问题
  8. 004. Asp.Net Routing与MVC 之二: 请求如何激活Controller和Action
  9. STM32的备份寄存器和控制状态寄存器
  10. 在 Linux 平台中调试 C/C++ 内存泄漏方法