`

JVM监控工具介绍jstack,jconsole,jinfo,jmap,jdb,jstat

jvm 
阅读更多

jstack -- 如果java程序崩溃生成core文件,jstack工具可以用来获得core文件的java stack和native stack的信息,从而可以轻松地知道java程序是如何崩溃和在程序何处发生问题。另外,jstack工具还可以附属到正在运行的java程序中,看到当时运行的java程序的java stack和native stack的信息, 如果现在运行的java程序呈现hung的状态,jstack是非常有用的。目前只有在Solaris和Linux的JDK版本里面才有。

jconsole – jconsole是基于Java Management Extensions (JMX)的实时图形化监测工具,这个工具利用了内建到JVM里面的JMX指令来提供实时的性能和资源的监控,包括了Java程序的内存使用,Heap size, 线程的状态,类的分配状态和空间使用等等。
jinfo – jinfo可以从core文件里面知道崩溃的Java应用程序的配置信息,目前只有在Solaris和Linux的JDK版本里面才有。

jmap – jmap 可以从core文件或进程中获得内存的具体匹配情况,包括Heap size, Perm size等等,目前只有在Solaris和Linux的JDK版本里面才有。

jdb – jdb 用来对core文件和正在运行的Java进程进行实时地调试,里面包含了丰富的命令帮助您进行调试,它的功能和Sun studio里面所带的dbx非常相似,但 jdb是专门用来针对Java应用程序的。

jstat – jstat利用了JVM内建的指令对Java应用程序的资源和性能进行实时的命令行的监控,包括了对Heap size和垃圾回收状况的监控等等。
jps – jps是用来查看JVM里面所有进程的具体状态, 包括进程ID,进程启动的路径等等。
jstatd
启动jvm监控服务。它是一个基于rmi的应用,向远程机器提供本机jvm应用程序的信息。默认端口1099。
实例:jstatd -J-Djava.security.policy=my.policy

my.policy文件需要自己建立,内如如下:
grant codebase "file:$JAVA_HOME/lib/tools.jar" {
permission java.security.AllPermission;
};
这是安全策略文件,因为jdk对jvm做了jaas的安全检测,所以我们必须设置一些策略,使得jstatd被允许作网络操作
上面的操作没有通过,出现:
Could not create remote object
access denied (java.util.PropertyPermission java.rmi.server.ignoreSubClasses write)
java.security.AccessControlException: access denied (java.util.PropertyPermission java.rmi.server.ignoreSubClasses write)
        at java.security.AccessControlContext.checkPermission(AccessControlContext.java:323)
        at java.security.AccessController.checkPermission(AccessController.java:546)
        at java.lang.SecurityManager.checkPermission(SecurityManager.java:532)
        at java.lang.System.setProperty(System.java:727)
        at sun.tools.jstatd.Jstatd.main(Jstatd.java:122)
create in your usr/java/bin the jstatd.all.policy file, with the content must be
grant codebase "file:${java.home}/../lib/tools.jar" {  permission java.security.AllPermission;  };

jps
列出所有的jvm实例
实例:
jps
列出本机所有的jvm实例

jps 192.168.0.77
列出远程服务器192.168.0.77机器所有的jvm实例,采用rmi协议,默认连接端口为1099
(前提是远程服务器提供jstatd服务)

输出内容如下:
jones@jones:~/data/ebook/java/j2se/jdk_gc$ jps
6286 Jps
6174  Jstat

jconsole
一个图形化界面,可以观察到java进程的gc,class,内存等信息。虽然比较直观,但是个人还是比较倾向于使用jstat命令(在最后一部分会对jstat作详细的介绍)。

jinfo(linux下特有)
观察运行中的java程序的运行环境参数:参数包括Java System属性和JVM命令行参数
实例:jinfo 2083
其中2083就是java进程id号,可以用jps得到这个id号。
输出内容太多了,不在这里一一列举,大家可以自己尝试这个命令。

jstack(linux下特有)
可以观察到jvm中当前所有线程的运行情况和线程当前状态
jstack 2083

jmap(linux下特有,也是很常用的一个命令)
观察运行中的jvm物理内存的占用情况。
参数如下:
-heap:打印jvm heap的情况
-histo:打印jvm heap的直方图。其输出信息包括类名,对象数量,对象占用大小。
-histo:live :同上,但是只答应存活对象的情况
-permstat:打印permanent generation heap情况

命令使用:
jmap -heap 2083
可以观察到New Generation(Eden Space,From Space,To Space),tenured generation,Perm Generation的内存使用情况

jmap -histo 2083 | jmap -histo:live 2083
可以观察heap中所有对象的情况(heap中所有生存的对象的情况)。包括对象数量和所占空间大小。

jstat
最后要重点介绍下这个命令。
这是jdk命令中比较重要,也是相当实用的一个命令,可以观察到classloader,compiler,gc相关信息
具体参数如下:
-class:统计class loader行为信息
-compile:统计编译行为信息
-gc:统计jdk gc时heap信息
-gccapacity:统计不同的generations(不知道怎么翻译好,包括新生区,老年区,permanent区)相应的heap容量情况
-gccause:统计gc的情况,(同-gcutil)和引起gc的事件
-gcnew:统计gc时,新生代的情况
-gcnewcapacity:统计gc时,新生代heap容量
-gcold:统计gc时,老年区的情况
-gcoldcapacity:统计gc时,老年区heap容量
-gcpermcapacity:统计gc时,permanent区heap容量
-gcutil:统计gc时,heap情况
-printcompilation:不知道干什么的,一直没用过。

一般比较常用的几个参数是:
jstat -class 2083 1000 10 (每隔1秒监控一次,一共做10次)
输出内容含义如下:


jstat -gc 2083 2000 20(每隔2秒监控一次,共做10)
输出内容含义如下:


如果能熟练运用这些命令,尤其是在linux下,那么完全可以代替jprofile等监控工具了,谁让它收费呢。呵呵。
用命令的好处就是速度快,并且辅助于其他命令,比如grep gawk sed等,可以组装多种符合自己需求的工具。

jps的用法
用来查看JVM里面所有进程的具体状态, 包括进程ID,进程启动的路径等等。与unix上的ps类似,用来显示本地的java进程,可以查看本地运行着几个java程序,并显示他们的进程号。

[root@localhost ~]# jps
25517 Jps
25444 Bootstrap

jstat的用法
用以判断JVM是否存在内存问题呢?如何判断JVM垃圾回收是否正常?一般的top指令基本上满足不了这样的需求,因为它主要监控的是总体的系统资源,很难定位到java应用程序。
Jstat是JDK自带的一个轻量级小工具。全称“Java Virtual Machine statistics monitoring tool”,它位于java的bin目录下,主要利用JVM内建的指令对Java应用程序的资源和性能进行实时的命令行的监控,包括了对Heap size和垃圾回收状况的监控。可见,Jstat是轻量级的、专门针对JVM的工具,非常适用。由于JVM内存设置较大,图中百分比变化不太明显
一个极强的监视VM内存工具。可以用来监视VM内存内的各种堆和非堆的大小及其内存使用量。
jstat工具特别强大,有众多的可选项,详细查看堆内各个部分的使用量,以及加载类的数量。使用时,需加上查看进程的进程id,和所选参数。


语法结构:
Usage: jstat -help|-options
       jstat -<option> [-t] [-h<lines>] <vmid> [<interval> [<count>]]

参数解释:
Options — 选项,我们一般使用 -gcutil 查看gc情况
vmid    — VM的进程号,即当前运行的java进程号
interval– 间隔时间,单位为秒或者毫秒
count   — 打印次数,如果缺省则打印无数次

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 — 从应用程序启动到采样时用于垃圾回收的总时间(单位秒)

实例使用1:
[root@localhost bin]# jstat -gcutil 25444
  S0     S1     E      O      P     YGC     YGCT    FGC    FGCT     GCT
11.63   0.00   56.46  66.92  98.49 162    0.248    6      0.331    0.579

实例使用2:
[root@localhost bin]# jstat -gcutil 25444 1000 5
  S0     S1     E      O      P     YGC     YGCT    FGC    FGCT     GCT
73.54   0.00  99.04  67.52  98.49    166    0.252     6    0.331    0.583
73.54   0.00  99.04  67.52  98.49    166    0.252     6    0.331    0.583
73.54   0.00  99.04  67.52  98.49    166    0.252     6    0.331    0.583
73.54   0.00  99.04  67.52  98.49    166    0.252     6    0.331    0.583
73.54   0.00  99.04  67.52  98.49    166    0.252     6    0.331    0.583


jstack的用法
如果java程序崩溃生成core文件,jstack工具可以用来获得core文件的java stack和native stack的信息,从而可以轻松地知道java程序是如何崩溃和在程序何处发生问题。另外,jstack工具还可以附属到正在运行的java程序中,看到当时运行的java程序的java stack和native stack的信息, 如果现在运行的java程序呈现hung的状态,jstack是非常有用的。目前只有在Solaris和Linux的JDK版本里面才有。

[root@localhost bin]# jstack 25444
Attaching to process ID 25917, please wait...
Debugger attached successfully.
Client compiler detected.
JVM version is 1.5.0_08-b03
Thread 25964: (state = BLOCKED)
Error occurred during stack walking:
sun.jvm.hotspot.debugger.DebuggerException: sun.jvm.hotspot.debugger.DebuggerException: get_thread_regs failed for a lwp
        at sun.jvm.hotspot.debugger.linux.LinuxDebuggerLocal$LinuxDebuggerLocalWorkerThread.execute(LinuxDebuggerLocal.java:134)
        at sun.jvm.hotspot.debugger.linux.LinuxDebuggerLocal.getThreadIntegerRegisterSet(LinuxDebuggerLocal.java:437)
        at sun.jvm.hotspot.debugger.linux.LinuxThread.getContext(LinuxThread.java:48)
        at sun.jvm.hotspot.runtime.linux_x86.LinuxX86JavaThreadPDAccess.getCurrentFrameGuess(LinuxX86JavaThreadPDAccess.java:75)
        at sun.jvm.hotspot.runtime.JavaThread.getCurrentFrameGuess(JavaThread.java:252)
        at sun.jvm.hotspot.runtime.JavaThread.getLastJavaVFrameDbg(JavaThread.java:211)
        at sun.jvm.hotspot.tools.StackTrace.run(StackTrace.java:50)
        at sun.jvm.hotspot.tools.JStack.run(JStack.java:41)
        at sun.jvm.hotspot.tools.Tool.start(Tool.java:204)
        at sun.jvm.hotspot.tools.JStack.main(JStack.java:58)
Caused by: sun.jvm.hotspot.debugger.DebuggerException: get_thread_regs failed for a lwp
        at sun.jvm.hotspot.debugger.linux.LinuxDebuggerLocal.getThreadIntegerRegisterSet0(Native Method)
        at sun.jvm.hotspot.debugger.linux.LinuxDebuggerLocal.access$800(LinuxDebuggerLocal.java:34)
        at sun.jvm.hotspot.debugger.linux.LinuxDebuggerLocal$1GetThreadIntegerRegisterSetTask.doit(LinuxDebuggerLocal.java:431)
        at sun.jvm.hotspot.debugger.linux.LinuxDebuggerLocal$LinuxDebuggerLocalWorkerThread.run(LinuxDebuggerLocal.java:109)


Thread 25963: (state = IN_NATIVE)
Error occurred during stack walking:
sun.jvm.hotspot.debugger.DebuggerException: sun.jvm.hotspot.debugger.DebuggerException: get_thread_regs failed for a lwp
        at sun.jvm.hotspot.debugger.linux.LinuxDebuggerLocal$LinuxDebuggerLocalWorkerThread.execute(LinuxDebuggerLocal.java:134)
        at sun.jvm.hotspot.debugger.linux.LinuxDebuggerLocal.getThreadIntegerRegisterSet(LinuxDebuggerLocal.java:437)
        at sun.jvm.hotspot.debugger.linux.LinuxThread.getContext(LinuxThread.java:48)
        at sun.jvm.hotspot.runtime.linux_x86.LinuxX86JavaThreadPDAccess.getCurrentFrameGuess(LinuxX86JavaThreadPDAccess.java:75)
        at sun.jvm.hotspot.runtime.JavaThread.getCurrentFrameGuess(JavaThread.java:252)
        at sun.jvm.hotspot.runtime.JavaThread.getLastJavaVFrameDbg(JavaThread.java:211)
        at sun.jvm.hotspot.tools.StackTrace.run(StackTrace.java:50)
        at sun.jvm.hotspot.tools.JStack.run(JStack.java:41)
        at sun.jvm.hotspot.tools.Tool.start(Tool.java:204)
        at sun.jvm.hotspot.tools.JStack.main(JStack.java:58)
Caused by: sun.jvm.hotspot.debugger.DebuggerException: get_thread_regs failed for a lwp
        at sun.jvm.hotspot.debugger.linux.LinuxDebuggerLocal.getThreadIntegerRegisterSet0(Native Method)
        at sun.jvm.hotspot.debugger.linux.LinuxDebuggerLocal.access$800(LinuxDebuggerLocal.java:34)
        at sun.jvm.hotspot.debugger.linux.LinuxDebuggerLocal$1GetThreadIntegerRegisterSetTask.doit(LinuxDebuggerLocal.java:431)
        at sun.jvm.hotspot.debugger.linux.LinuxDebuggerLocal$LinuxDebuggerLocalWorkerThread.run(LinuxDebuggerLocal.java:109)

  • 大小: 38.6 KB
  • 大小: 87.8 KB
分享到:
评论

相关推荐

    JVM监控工具介绍jstack_jconsole_jinfo_jmap_jdb_jstat

    本文将介绍五种JVM监控工具:jstack、jconsole、jinfo、jmap和jdb。 jstack jstack是一款命令行工具,用于生成Java应用程序的崩溃dump文件的信息。该工具可以attach到正在运行的Java应用程序中,查看当前运行的...

    JVM监控工具介绍jstack, jconsole, jinfo, jmap, jdb, jstat.doc

    本文将深入探讨六种关键的JVM监控工具——`jstack`, `jconsole`, `jinfo`, `jmap`, `jdb`, `jstat`——它们各自的功能、应用场景及如何帮助开发者和运维人员诊断并解决JVM中的复杂问题。 #### 1. jstack —— Java ...

    【转】Java内存泄露_JVM监控工具介绍jstack_jconsole_jinfo_jmap_jdb_jstat

    本篇将重点介绍几种常用的JVM监控工具,包括jstack、jconsole、jinfo、jmap以及jdb和jstat。 首先,`jstack`是一个用于打印Java线程堆栈跟踪的工具。当应用出现死锁或者线程阻塞时,jstack可以帮助我们查看各个线程...

    jvm监控工具介绍

    为了有效地监控和调试Java应用程序,Oracle JDK提供了多种强大的命令行工具,如jconsole、jmap、jstat等。下面将详细解释这些工具的功能和使用场景。 1. **jstack**: jstack是一种用于生成Java线程堆栈跟踪的工具...

    JVM监控工具介绍.docx

    以下是几种常用的JVM监控工具的详细介绍: 1. **jstack**: `jstack` 是一个用于打印Java线程堆栈跟踪的工具,它可以帮助我们了解应用程序中线程的状态,比如是否发生死锁或者线程阻塞。通过指定进程ID,我们可以...

    JVM监控工具介绍

    本文将详细介绍JVM自带的一些核心监控工具,包括jstack、jconsole、jinfo、jmap、jdb和jstat等命令的使用方法。 #### jstack **概述:** jstack是一个强大的诊断工具,主要用于获取JVM中的线程快照。当Java程序...

    Java内存泄露_JVM监控工具介绍

    "Java内存泄露_JVM监控工具介绍" Java内存泄露是Java开发中常见的一种问题,发生内存泄露可能会导致Java应用程序崩溃或性能下降。在Java中,内存泄露的原因非常多样,例如,静态变量、循环引用、数据库连接池、...

    JAVA命令大全-JVM设置.rar

    3. **性能监控**:`jstat`用于监控JVM的运行时统计信息,`jmap`获取堆内存详细信息或生成堆转储文件,`jhat`分析堆转储文件,`jconsole`和`jvisualvm`提供图形界面进行性能监控和诊断。 4. **JVM诊断**:`jinfo`...

    Troubleshooting Guide for Java

    - **jinfo**:查询和更改JVM配置选项的工具。 - **jmap**:生成堆转储快照并分析堆内存使用情况的工具。 - **jps**:列出正在运行的所有Java应用程序的进程ID。 - **jrunscript**:执行JavaScript脚本文件。 - **...

    java—JDK内置工具使用技巧详解

    - **功能**:jconsole 是一个基于 JMX(Java Management Extensions)技术的图形化监控工具,能够实时显示 JVM 的内存使用情况、垃圾回收状态等信息。 - **使用场景**:适用于需要实时监控 Java 应用程序资源使用...

    jvm+watch.pdf

    2. **jconsole**:这是一个基于Java Management Extensions (JMX) 的实时图形化监控工具,它可以提供关于Java程序内存使用、堆大小、线程状态、类分配等信息的实时监控。尽管配置较为复杂,但它提供了强大的可视化...

    OpenJDK11U-jdk_x64_linux_hotspot_11.0.11_9.tar.gz

    - 使用`jinfo`, `jmap`, `jstat`, `jstack`等工具进行实时监控和诊断。 总的来说,OpenJDK 11提供了许多增强功能和性能优化,是现代Java开发的重要基础。了解并掌握其特性和使用方法,对于任何Java开发者来说都是至...

    java2应用命令详解

    7. **jconsole** 和 **jvisualvm**:JVM 监视和管理工具 这两个图形界面工具可以帮助开发者监视和分析 Java 进程的内存、CPU 使用率、线程状态等。它们通常随 JDK 一起安装。 8. **jmap** 和 **jhat**:内存映射和...

    linux x86 jdk 1.8

    - **jstat**: 监控JVM的各种性能数据。 **2. JDK 1.8的新特性** - **Lambda表达式**: 允许以更简洁的方式处理函数接口,提高了代码的可读性和简洁性。 - **Stream API**: 提供了一种处理集合的新方法,支持并行操作...

    Java开发指令大全.7z

    5. **JVM监控与管理**:`jps`显示运行中的Java进程,`jstat`用于收集JVM统计信息,`jmap`帮助分析内存映射,而`jstack`则用于获取线程堆栈跟踪。这些工具对于理解和优化Java应用性能至关重要。 6. **Java内存管理**...

    jdk-7u75-windows-x64.zip

    9. **其他实用工具**:如appletviewer、extcheck、idlj、jar、jarsigner、jarsigner.bat、java-rmi.cgi、jconsole、jdb、jhat、jinfo、jnlp、jmap、jmc、jps、jrunscript、jsadebugd、jstack、jstat、jstatd、...

    Java2 语言命令详解

    11. **jstat**: 监控JVM统计信息,如垃圾收集、内存使用等。 12. **jstack**: 显示Java线程堆栈跟踪,用于排查死锁和阻塞问题。 13. **java Mission Control (JMC)**: 是Oracle提供的一款高级性能分析工具,包含了...

    jdk-6u45-windows-x64.rar

    7. **其他工具**:如appletviewer、apt、extcheck、idlj、jarsigner、jconsole、jdb、jdwp、jhat、jinfo、jmap、jmc、jps、jrunscript、jstack、jstat、jstatd等,它们提供了各种附加功能,如性能监控、内存分析等。...

    JDK_V1.8.0u172_x64.rar

    - **jps**、**jinfo**、**jstat**和**jstack**:系统监控和诊断工具,提供进程状态、配置信息、统计信息和线程堆栈跟踪。 **总结** JDK V1.8.0u172是Java 8的一个重要更新,它的API规范、新功能以及丰富的开发工具...

Global site tag (gtag.js) - Google Analytics