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

控制台输出的部分结果:

Full thread dump Java HotSpot(TM) Server VM (25.151-b12 mixed mode):

"Attach Listener" # daemon prio= os_prio= tid=0xa58bd000 nid=0x6427 waiting on condition [0x00000000]
java.lang.Thread.State: RUNNABLE Locked ownable synchronizers:
- None "Abandoned connection cleanup thread" # daemon prio= os_prio= tid=0x09bc8800 nid=0x4932 in Object.wait() [0xa558c000]
java.lang.Thread.State: TIMED_WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:)
- locked <0xad5b5730> (a java.lang.ref.ReferenceQueue$Lock)
at com.mysql.jdbc.AbandonedConnectionCleanupThread.run(AbandonedConnectionCleanupThread.java:) Locked ownable synchronizers:
- None "Tomcat JDBC Pool Cleaner[24630847:1546674815832]" # daemon prio= os_prio= tid=0x096f9000 nid=0x4931 in Object.wait() [0xa55dd000]
java.lang.Thread.State: TIMED_WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
at java.util.TimerThread.mainLoop(Timer.java:)
- locked <0xad2b10d0> (a java.util.TaskQueue)
at java.util.TimerThread.run(Timer.java:) Locked ownable synchronizers:
- None "ajp-nio-8009-AsyncTimeout" # daemon prio= os_prio= tid=0xa7eae000 nid=0x492f waiting on condition [0xa5cb8000]
java.lang.Thread.State: TIMED_WAITING (sleeping)
at java.lang.Thread.sleep(Native Method)
at org.apache.coyote.AbstractProtocol$AsyncTimeout.run(AbstractProtocol.java:)
at java.lang.Thread.run(Thread.java:) Locked ownable synchronizers:
- None "ajp-nio-8009-Acceptor-0" # daemon prio= os_prio= tid=0xa7eacc00 nid=0x492e runnable [0xa5d09000]
java.lang.Thread.State: RUNNABLE
at sun.nio.ch.ServerSocketChannelImpl.accept0(Native Method)
at sun.nio.ch.ServerSocketChannelImpl.accept(ServerSocketChannelImpl.java:)
at sun.nio.ch.ServerSocketChannelImpl.accept(ServerSocketChannelImpl.java:)
- locked <0xac53a438> (a java.lang.Object)
at org.apache.tomcat.util.net.NioEndpoint$Acceptor.run(NioEndpoint.java:)
at java.lang.Thread.run(Thread.java:) Locked ownable synchronizers:
- None

1.2 jstack -m 18614

下面的部分结果中的红色字说明没有死锁发生。

Attaching to process ID , please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.151-b12
Deadlock Detection: No deadlocks found. ----------------- -----------------
0xf7735430 ????????
0xa87b2938 NET_Timeout + 0x38
0xa87aecbe Java_java_net_PlainSocketImpl_socketAccept + 0x21e
0xe74fb646 * java.net.PlainSocketImpl.socketAccept(java.net.SocketImpl) bci: (Interpreted frame)
0xe74f1d4a * java.net.AbstractPlainSocketImpl.accept(java.net.SocketImpl) bci: line: (Interpreted frame)
0xe74f1d4a * java.net.ServerSocket.implAccept(java.net.Socket) bci: line: (Interpreted frame)
0xe74f1d4a * java.net.ServerSocket.accept() bci: line: (Interpreted frame)
0xe74f1b54 * org.apache.catalina.core.StandardServer.await() bci: line: (Interpreted frame)
0xe74f1d7f * org.apache.catalina.startup.Catalina.await() bci: line: (Interpreted frame)
0xe74f1d4a * org.apache.catalina.startup.Catalina.start() bci: line: (Interpreted frame)
0xe74ed499 <StubRoutines>
0xf6becb3f _ZN9JavaCalls11call_helperEP9JavaValueP12methodHandleP17JavaCallArgumentsP6Thread + 0x101f
0xf6e40489 _ZN2os20os_exception_wrapperEPFvP9JavaValueP12methodHandleP17JavaCallArgumentsP6ThreadES1_S3_S5_S7_ + 0x19
0xf6beb10f _ZN9JavaCalls4callEP9JavaValue12methodHandleP17JavaCallArgumentsP6Thread + 0x2f
0xf6eb2812 _ZN10Reflection6invokeE19instanceKlassHandle12methodHandle6Handleb14objArrayHandle9BasicTypeS3_bP6Thread + 0x4d2
0xf6eb5ba8 _ZN10Reflection13invoke_methodEP7oopDesc6Handle14objArrayHandleP6Thread + 0x148
0xf6c7f4ef JVM_InvokeMethod + 0x25f
0xf6629552 Java_sun_reflect_NativeMethodAccessorImpl_invoke0 + 0x32
0xe74fb646 * sun.reflect.NativeMethodAccessorImpl.invoke0(java.lang.reflect.Method, java.lang.Object, java.lang.Object[]) bci: (Interpreted frame)
0xe74f1b54 * sun.reflect.NativeMethodAccessorImpl.invoke(java.lang.Object, java.lang.Object[]) bci: line: (Interpreted frame)
0xe7639144 * sun.reflect.DelegatingMethodAccessorImpl.invoke(java.lang.Object, java.lang.Object[]) bci: line: (Compiled frame)
* java.lang.reflect.Method.invoke(java.lang.Object, java.lang.Object[]) bci: line: (Compiled frame)
* org.apache.catalina.startup.Bootstrap.start() bci: line: (Interpreted frame)
0xe74f1d4a * org.apache.catalina.startup.Bootstrap.main(java.lang.String[]) bci: line: (Interpreted frame)
0xe74ed499 <StubRoutines>
0xf6becb3f _ZN9JavaCalls11call_helperEP9JavaValueP12methodHandleP17JavaCallArgumentsP6Thread + 0x101f
0xf6e40489 _ZN2os20os_exception_wrapperEPFvP9JavaValueP12methodHandleP17JavaCallArgumentsP6ThreadES1_S3_S5_S7_ + 0x19
0xf6beb10f _ZN9JavaCalls4callEP9JavaValue12methodHandleP17JavaCallArgumentsP6Thread + 0x2f
0xf6c35187 _ZL17jni_invoke_staticP7JNIEnv_P9JavaValueP8_jobject11JNICallTypeP10_jmethodIDP18JNI_ArgumentPusherP6Thread + 0x387
0xf6c47c0f jni_CallStaticVoidMethod + 0xdf
0xf76de8a9 JavaMain + 0x8e9
0xf76f3b2c start_thread + 0xcc
----------------- -----------------
0xf7735430 ????????
----------------- -----------------
0xf7735430 ????????
----------------- -----------------
0xf7735430 ????????
----------------- -----------------
0xf7735430 ????????
----------------- -----------------
0xf7735430 ????????
----------------- -----------------
0xf7735430 ????????
sun.jvm.hotspot.debugger.UnmappedAddressException: f0
at sun.jvm.hotspot.debugger.PageCache.checkPage(PageCache.java:)
at sun.jvm.hotspot.debugger.PageCache.getData(PageCache.java:)
at sun.jvm.hotspot.debugger.DebuggerBase.readBytes(DebuggerBase.java:)
at sun.jvm.hotspot.debugger.linux.LinuxDebuggerLocal.readCInteger(LinuxDebuggerLocal.java:)
at sun.jvm.hotspot.debugger.DebuggerBase.readAddressValue(DebuggerBase.java:)
at sun.jvm.hotspot.debugger.linux.LinuxDebuggerLocal.readAddress(LinuxDebuggerLocal.java:)
at sun.jvm.hotspot.debugger.linux.LinuxAddress.getAddressAt(LinuxAddress.java:)
at sun.jvm.hotspot.debugger.linux.x86.LinuxX86CFrame.sender(LinuxX86CFrame.java:)
at sun.jvm.hotspot.tools.PStack.run(PStack.java:)
at sun.jvm.hotspot.tools.PStack.run(PStack.java:)
at sun.jvm.hotspot.tools.PStack.run(PStack.java:)
at sun.jvm.hotspot.tools.JStack.run(JStack.java:)
at sun.jvm.hotspot.tools.Tool.startInternal(Tool.java:)
at sun.jvm.hotspot.tools.Tool.start(Tool.java:)
at sun.jvm.hotspot.tools.Tool.execute(Tool.java:)
at sun.jvm.hotspot.tools.JStack.main(JStack.java:)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:)
at java.lang.reflect.Method.invoke(Method.java:)
at sun.tools.jstack.JStack.runJStackTool(JStack.java:)
at sun.tools.jstack.JStack.main(JStack.java:)

----------------- 18622 -----------------
0xf7735430 ????????
----------------- 18623 -----------------
0xf7735430 ????????
----------------- 18624 -----------------
0xf7735430 ????????
----------------- 18625 -----------------
0xf7735430 ????????
----------------- 18631 -----------------
0xf7735430 ????????
----------------- 18649 -----------------
0xf7735430 ????????
----------------- 18650 -----------------
0xf7735430 ????????
0xe7d9e4cb <Unknown compiled code>
0xe806cbfc * sun.nio.ch.EPollArrayWrapper.poll(long) bci:18 line:269 (Compiled frame)
* sun.nio.ch.EPollSelectorImpl.doSelect(long) bci:28 line:93 (Compiled frame)
* sun.nio.ch.SelectorImpl.lockAndDoSelect(long) bci:37 line:86 (Compiled frame)
* sun.nio.ch.SelectorImpl.select(long) bci:30 line:97 (Compiled frame)
----------------- 18651 -----------------
0xf7735430 ????????
0xe7d9e4cb <Unknown compiled code>
0xe806cbfc * sun.nio.ch.EPollArrayWrapper.poll(long) bci:18 line:269 (Compiled frame)
* sun.nio.ch.EPollSelectorImpl.doSelect(long) bci:28 line:93 (Compiled frame)
* sun.nio.ch.SelectorImpl.lockAndDoSelect(long) bci:37 line:86 (Compiled frame)
* sun.nio.ch.SelectorImpl.select(long) bci:30 line:97 (Compiled frame)

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 0.338 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 0.338 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 0.338 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 0.338 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 0.338 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 0.338 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 0.338 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 0.338 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 0.338 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 0.338 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 - 0.338 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
6350.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 41216.0 164096.0 5723.0 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 0.239 0.580

2.5 jstat -compiler 18614

Compiled Failed Invalid   Time   FailedType FailedMethod
21.29 com/mysql/jdbc/AbandonedConnectionCleanupThread run

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

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

Linux下的java虚拟机性能监控与故障处理命令的更多相关文章

  1. java - 虚拟机性能监控与故障处理工具

    背景 在项目开发中往往不是一个人完成整个项目,而是由一个团队进行开发,而团队中成员的编程能力参差不齐难免会影响项目性能.当一个项目基本定型后难免会遇到项目产品使用的效果不理想例如长时间失去响应.系统卡 ...

  2. 《深入理解Java虚拟机》虚拟机性能监控与故障处理工具

    上节学习回顾 从课本章节划分,<垃圾收集器>和<内存分配策略>这两篇随笔同属一章节,主要是从理论+实验的手段来讲解JVM的内存处理机制.好让我们对JVM运行机制有一个良好的概念 ...

  3. 《深入理解Java虚拟机》(四)虚拟机性能监控与故障处理工具

    虚拟机性能监控与故障处理工具 详解 4.1 概述 本文参考的是周志明的 <深入理解Java虚拟机> 第四章 ,为了整理思路,简单记录一下,方便后期查阅. JDK本身提供了很多方便的JVM性 ...

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

    From:  https://c.m.163.com/news/a/D7B0C6Q40511PFUO.html?spss=newsapp&fromhistory=1 Java虚拟机性能监控与调 ...

  5. JYM虚拟机性能监控与故障处理工具

    虚拟机性能监控与故障处理工具 一.jps:虚拟机进程状况工具 常用指令 二.jstat:虚拟机统计信息监视工具 常用指令 三.jinfo:配置信息工具 四.jmap:Java内存映像工具 常用指令 五 ...

  6. JVM性能监控与故障处理命令行工具

    JDK命令行工具 Sun公司作为”礼物“赠送给JDK使用者的工具: 这些命令行工具大多是jdk/lib/tools.jar类库的一层薄包装,主要功能代码是在tools类库(不属于java的标准API) ...

  7. Java虚拟机8:虚拟机性能监控与故障处理工具

    前言 定位系统问题的时候,知识.经验是基础,数据是依据,工具是运用知识处理数据的手段.这里说的数据包括:运行日志.异常堆栈.GC日志.线程快照.堆转储快照等.经常使用适当的虚拟机监控和分析的工具可以加 ...

  8. 《深入理解Java虚拟机》-----第4章 虚拟机性能监控与故障处理工具

    理论总是作为指导实践的工具,能把这些知识应用到实际工作中才是 我们的最终目的. 给一个系统定位问题的时候,知识.经验是关键基础,数据是依据,工具是运用知识处理数据的手段.这里说的数据包括:运行日志.异 ...

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

    摘抄 http://uule.iteye.com/blog/2114697 一.JVM内存模型及垃圾收集算法  1.根据Java虚拟机规范,JVM将内存划分为: New(年轻代) Tenured(年老 ...

随机推荐

  1. 线程中的setDaemon方法

    setDaemon方法必须在start方法前定义.t1.setDaemon(True),该语句的意思是:将主线程A设置为子线程t1的守护线程.也就是在执行程序时,t1会随着主线程A的退出而退出,不论t ...

  2. 信息安全技能树(SecWiki中Web安全工程师职位建议)

    职位描述: 对公司网站.业务系统进行安全评估测试(黑盒.白盒测试): 对公司各类系统进行安全加固: 对公司安全事件进行响应,清理后门,根据日志分析攻击途径: 安全技术研究,包括安全防范技术,黑客技术等 ...

  3. python_flask 基础巩固 (URL_FOR 详解)

    URL_FOR 详解 url_for 通过 视图函数能够返回对应的url,url_for 有两个参数,endpoint(视图 函数)和关键字参数 url_for('my_list',page=2),多 ...

  4. html或者jsp页面刷新问题

    setTimeout(function(){window.location.reload();//刷新当前页面.},2000) window.location.reload();//刷新当前页面.pa ...

  5. 服务器windows2008系统登录报错:由于远程桌面服务当前正忙,因此无法完成您尝试的任务。请在...

    1.问题描述:windows server 2008服务器通过远程桌面登录时很慢,登录不进去,把远程桌面关掉后,再用远程桌面登录时,出现下图提示. 把服务器接上显示器键盘鼠标后,卡在系统登录的欢迎界面 ...

  6. shell实例利用crontab自动清除日志

    shell实例利用crontab自动清除日志 程序运行会产生很多的日志,对于无用的日志手动删除比价麻烦,写一个自动执行的命令是很有必要的. 删除文件shell命令 find 对应目录 -mtime + ...

  7. opencl 参考源码及benchmark

    转载:https://www.zhihu.com/question/25539755/answer/44917891 CUDA 5之前的版本有OpenCL的sample,可以上网找找看 AMD APP ...

  8. st表(poj3264)

    st表很像线段树,但线段树既能查询和修改,而st表只能查询. 首先我们先用二维数组建立一个表,st[i][j]表内存的是从第i位开始1<<j范围内的best(st[i][j-1],st[i ...

  9. Maven3-依赖

    依赖配置 我们先来看一份简单的依赖声明: <project> ... <dependencies> <dependency> <groupId>...& ...

  10. Android-Java-接口Interface

    接口Interface 与 抽象类不同: 抽象类关注的是事物本质,例如:水果Fruit 属于抽象的,说去买水果 是模糊的概念 是抽象的概念 不具体,到底买什么水果不知道,而水果包含了 香蕉,橘子 很多 ...