`
wsmajunfeng
  • 浏览: 498194 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

(转)Java自带的性能监测工具用法简介——jstack、jconsole、jinfo、jmap、jdb、jsta、jvisualvm

    博客分类:
  • jvm
 
阅读更多

在开始介绍之前,先介绍几篇写的比较详细的博客,咱们不求最精,一定最全,最省事。
http://blog.csdn.net/fenglibing/article/details/6411924
一、jstatd
启动jvm监控服务。它是一个基于rmi的应用,向远程机器提供本机jvm应用程序的信息。默认端口1099。
实例:jstatd -J-Djava.security.policy=my.policy

my.policy文件需要自己建立,内如如下:

Java代码  收藏代码
  1. grant codebase  "file:${java.home}/../lib/tools.jar"  {  
  2.  permission java.security.AllPermission;  
  3. };  


这是安全策略文件,因为jdk对jvm做了jaas的安全检测,所以我们必须设置一些策略,使得jstatd被允许作网络操作

二、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

详细请看连接:http://www.blogjava.net/aoxj/archive/2007/12/29/171447.html

三、jconsole

用法: jconsole [ -interval=n ] [ -notile ] [ -pluginpath  ] [ -version ] [ connection ...]

  -interval   将更新间隔时间设置为 n 秒(默认值为 4 秒)
  -notile     最初不平铺显示窗口(对于两个或更多连接)
  -pluginpath 指定 jconsole 用于查找插件的路径
  -version    输出程序版本

  connection = pid || host:port || JMX URL (service:jmx:://...)

  pid       目标进程的进程 ID
  host      远程主机名或 IP 地址
  port      用于远程连接的端口号

  -J          对正在运行 jconsole 的 Java 虚拟机指定输入参数


在cmd中输入命令:jconsole 3980[java进程号] 弹出下图



四、jinfo
用法:
jinfo [ option ] pid
jinfo [ option ] executable core
jinfo [ option ] [server-id@]remote-hostname-or-IP

参数:

pid   进程号
executable   产生core dump的java executable
core   core file
remote-hostname-or-IP  主机名或ip
server-id    远程主机上的debug server的唯一id

选项:
no option  打印命令行参数和系统属性
-flags  打印命令行参数
-sysprops  打印系统属性
-h  帮助


观察运行中的java程序的运行环境参数:参数包括Java System属性和JVM命令行参数
实例:
jinfo 2083
其中2083就是java进程id号,可以用jps得到这个id号。我在windows上尝试输入这个命令,但是不管用,于是我输入了下面这个命令:
jinfo -flag MaxPermSize 3980
显示如下:
-XX:MaxPermSize=67108864

五、jstack
该命令应该如何使用呢?首先需要用jstack命令产生java进程的dump文件,然后分析dump文件中的数据,下面的连接是一篇讲述如何分析jstack产生的dump文件数据的文章,写的非常不错:
http://www.blogjava.net/jzone/articles/303979.html

命令格式:
jstack [ option ] pid
基本参数:
-F当’jstack [-l] pid’没有相应的时候强制打印栈信息
-l长列表. 打印关于锁的附加信息,例如属于java.util.concurrent的ownable synchronizers列表.
-m打印java和native c/c++框架的所有栈信息.
-h | -help打印帮助信息
pid 需要被打印配置信息的java进程id,可以用jps查询.

具体用法
jstack -l 进程ID


六、jmap(linux下特有,也是很常用的一个命令)
观察运行中的jvm物理内存的占用情况。
Usage:
    jmap [option] <pid>
        (to connect to running process)
    jmap [option] <executable <core>
        (to connect to a core file)
    jmap [option] [server_id@]<remote server IP or hostname>
        (to connect to remote debug server)

where <option> is one of:
    <none>               to print same info as Solaris pmap
    -heap                to print java heap summary
    -histo[:live]        to print histogram of java object heap; if the "live"
                         suboption is specified, only count live objects
    -permstat            to print permanent generation statistics
    -finalizerinfo       to print information on objects awaiting finalization
    -dump:<dump-options> to dump java heap in hprof binary format
                         dump-options:
                           live         dump only live objects; if not specified,
                                        all objects in the heap are dumped.
                           format=b     binary format
                           file=<file>  dump heap to <file>
                         Example: jmap -dump:live,format=b,file=heap.bin <pid>
    -F                   force. Use with -dump:<dump-options> <pid> or -histo
                         to force a heap dump or histogram when <pid> does not
                         respond. The "live" suboption is not supported
                         in this mode.
    -h | -help           to print this help message
    -J<flag>             to pass <flag> directly to the runtime system

参数如下:
-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中所有生存的对象的情况)。包括对象数量和所占空间大小。

jmap -histo java进程id
可以查看java进程中的所有实例、实例的个数,可用于查询单例对象是否真的只生成了一个实例。

在控制台,输入命令“jmap -histo 7329 > histo_dump”,得到如下结果:

Java代码  收藏代码
  1. num     #instances         #bytes   class  name  
  2. ---------------------------------------------  
  3.   1 :         605348         68849960   [C  
  4.   2 :        1609734         51511488   java.util.concurrent.ConcurrentHashMap$Segment  
  5.   3 :        1610022         38640528   java.util.concurrent.locks.ReentrantLock$NonfairSync  
  6.   4 :          70784         31478168   [I  
  7.   5 :         218224         27628072   <constMethodKlass>  
  8.   6 :        1609734         26423552   [Ljava.util.concurrent.ConcurrentHashMap$HashEntry;  
  9.   7 :          40379         24430792   [B  
  10.   8 :         218224         19211544   <methodKlass>  
  11.   9 :         602848         14468352   java.lang.String  
  12.  10 :          19374         11640184   <constantPoolKlass>  
  13.  11 :         236950         11451216   <symbolKlass>  
  14.  12 :         283746         11349840   java.util.concurrent.ConcurrentHashMap$ValueIterator  
  15.  13 :          19374          8826272   <instanceKlassKlass>  
  16.  14 :         100613          8048728   [Ljava.util.concurrent.ConcurrentHashMap$Segment;  
  17.  15 :          85036          7332664   [Ljava.lang.Object;  
  18.  16 :          15559          6614824   <constantPoolCacheKlass>  
  19.  17 :          78919          6313520   java.lang.reflect.Method  
  20.  18 :         103377          4962096   com.sun.tools.javac.zip.ZipFileIndexEntry  
  21.  19 :          51998          4324096   [Ljava.util.HashMap$Entry;  
  22.  20 :         100613          4024520   java.util.concurrent.ConcurrentHashMap  
  23.  21 :         157136          3771264   java.util.concurrent.ConcurrentHashMap$HashEntry  
  24.  22 :          35932          3736928   com.asiainfo.dbm.core.bean.monitor.FlowService  
  25.  23 :          35932          3736928   com.asiainfo.dbm.core.bean.monitor.FlowService  


该命令通常用来分析内存泄漏OOM,通常做法是,首先配置JVM启动参数,让JVM在遇到OutOfMemoryError时自动生成Dump文件:

Java代码  收藏代码
  1. -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/path  


然后使用命令:

Java代码  收藏代码
  1. jmap  -dump:format=b,file=/path/heap.bin 进程ID     


如果只dump heap中的存活对象,则加上选项-live,如下:

Java代码  收藏代码
  1. jmap  -dump:live,format=b,file=/path/heap.bin 进程ID  


最后在eclipse中安装MAT插件(http://www.eclipse.org/mat/ ), 然后在eclipse中,file---->open,打开这个文件heap.bin,利用现成的OOM工具进行分析。具体操作方法:首先输入网址 http://www.eclipse.org/mat/previousReleases.php,然后查看你自己的Eclipse版本,我的是 Indigo的,所以点击链接“Previous Releases”,选择Indigo版本的URLhttp://download.eclipse.org/mat/1.1.0/update-site/

七、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:不知道干什么的,一直没用过。


一般比较常用的几个参数是:

Java代码  收藏代码
  1. jstat - class   27629   3000   10   //每隔1秒监控一次,一共做10次   


输出内容含义如下:

Loaded Bytes Unloaded Bytes Time
49955 49701.5    35528 32456.1      34.71
49955 49701.5    35528 32456.1      34.71
49955 49701.5    35528 32456.1      34.71
49955 49701.5    35528 32456.1      34.71
49963 49708.8    35528 32456.1      34.71
49963 49708.8    35528 32456.1      34.71
49963 49708.8    35528 32456.1      34.71
49971 49716.1    35528 32456.1      34.71
49971 49716.1    35528 32456.1      34.71
49971 49716.1    35528 32456.1      34.71



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

S0C Current survivor(存活的) space 0 capacity (KB).
EC Current eden space capacity (KB).
EU Eden space utilization (KB).
OC Current old space capacity (KB).
OU Old space utilization (KB).
PC Current permanent space capacity (KB).
PU Permanent space utilization (KB).
YGC Number of young generation GC Events.
YGCT Young generation garbage collection time.(单位秒)
FGC Number of full GC events.
FGCT Full garbage collection time.(单位秒)
GCT Total garbage collection time.(单位秒)



监控内存使用情况 参数 (查看内存溢出相对有用)
jstat -gccause 2083 5000 (每隔5秒监控一次)
输出内容含义如下:

S0 Survivor space 0 utilization as a percentage of the space's current capacity.
S1 Survivor space 1 utilization as a percentage of the space's current capacity.
E Eden space utilization as a percentage of the space's current capacity.
O Old space utilization as a percentage of the space's current capacity.
P Permanent space utilization as a percentage of the space's current capacity.
YGC Number of young generation GC events.
YGCT Young generation garbage collection time.
FGC Number of full GC events.
FGCT Full garbage collection time.
GCT Total garbage collection time.
LGCC Cause of last Garbage Collection.
GCC Cause of current Garbage Collection.



八、jvisualvm
java visualvm 是visualvm的一个针对java vm的发布版本。 关于visualvm的更多信息可以访问 visualvm.java.net.jvisualvm 工具从jdk 6 update7 (apple的java 是从 mac os x 10.5 update 4)之后,默认就已经存在jdk工具里。
java visualvm是一个稳定的工具,用每一个jdk发布版本测试过。 最新的jdk请到oracle(sun)公司的网上进行下载。

jvisualvm 的功能及ui比jconsole还要强大。我们先来看下jvisualvm的用法。 他是一个gui(图形界面)的工具,所以上手应该会很快。

官网上关于jvisualvm的用法介绍 http://docs.oracle.com/javase/6/docs/technotes/tools/share/jvisualvm.html

简单来说,我们不需要传递任何参数就可以启动jvisualvm。

我们可以把jvisualvm也放到jdk的path里, 然后加到环境的path里。 这时候我们在windows的运行或者cmd里运行
jvisualvm就可以启动该工具了。 或者我们直接双击点击该软件
在cmd中输入命令:jvisualvm 弹出下图


具体用法可以参考下面这个链接:http://www.iteye.com/topic/516447

下面我们来讲解如何利用visualvm对远程的主机进行监控
首先,我们可以在用户目录下的任何地方(比如说:用户根目录,或者是jdk根目录)新建一个名称为jstatd.all.policy的文件,文件内容如下:

Java代码  收藏代码
  1. grant codebase  "file:${java.home}/../lib/tools.jar"  {     
  2.   permission java.security.AllPermission;     
  3. };  



新建完文件后,我们给这个文件赋予执行权限,命令如下:

Java代码  收藏代码
  1. chmod  755  jstatd.all.policy  



然后,我们在我们运行如下命令,启动jstatd服务(jstatd服务的默认端口为1099):

Java代码  收藏代码
  1. jstatd -J-Djava.security.policy=/sw/bes/jstatd.all.policy  


记住jstatd.all.policy文件必须为绝对路径,防止出现 java.security.AccessControlException: access denied (java.util.PropertyPermission java.rmi.server.ignoreSubClasses write)错误。

最后,我们可以用jps命令查看是否启动成功:

Java代码  收藏代码
  1. jps -l  


得到如下结果:

  • 9481 com.bes.enterprise.ee.nodeagent.NodeAgentMain
  • 7329 com.bes.enterprise.server.Entry
  • 18968 com.bes.enterprise.server.Entry
  • 15802 sun.tools.jstatd.Jstatd
  • 16075 sun.tools.jps.Jps
  • 9328 com.bes.enterprise.server.Entry

 

 

一些术语的中文解释:

         S0C:年轻代中第一个survivor(幸存区)的容量 (字节)
         S1C:年轻代中第二个survivor(幸存区)的容量 (字节)
         S0U:年轻代中第一个survivor(幸存区)目前已使用空间 (字节)
         S1U:年轻代中第二个survivor(幸存区)目前已使用空间 (字节)
           EC:年轻代中Eden(伊甸园)的容量 (字节)
           EU:年轻代中Eden(伊甸园)目前已使用空间 (字节)
           OC:Old代的容量 (字节)
           OU:Old代目前已使用空间 (字节)
           PC:Perm(持久代)的容量 (字节)
           PU:Perm(持久代)目前已使用空间 (字节)
        YGC:从应用程序启动到采样时年轻代中gc次数
        YGCT:从应用程序启动到采样时年轻代中gc所用时间(s)
        FGC:从应用程序启动到采样时old代(全gc)gc次数
        FGCT:从应用程序启动到采样时old代(全gc)gc所用时间(s)
        GCT:从应用程序启动到采样时gc用的总时间(s)

     NGCMN:年轻代(young)中初始化(最小)的大小 (字节)

     NGCMX:年轻代(young)的最大容量 (字节)

     NGC:年轻代(young)中当前的容量 (字节)

     OGCMN:old代中初始化(最小)的大小 (字节)

     OGCMX:old代的最大容量 (字节)

     OGC:old代当前新生成的容量 (字节)

     PGCMN:perm代中初始化(最小)的大小 (字节)

     PGCMX:perm代的最大容量 (字节)

     PGC:perm代当前新生成的容量 (字节)

           S0:年轻代中第一个survivor(幸存区)已使用的占当前容量百分比

           S1:年轻代中第二个survivor(幸存区)已使用的占当前容量百分比

           E:年轻代中Eden(伊甸园)已使用的占当前容量百分比

           O:old代已使用的占当前容量百分比

           P:perm代已使用的占当前容量百分比

  S0CMX:年轻代中第一个survivor(幸存区)的最大容量 (字节)

  S1CMX :年轻代中第二个survivor(幸存区)的最大容量 (字节)

  ECMX:年轻代中Eden(伊甸园)的最大容量 (字节)

  DSS:当前需要survivor(幸存区)的容量 (字节)(Eden区已满)

  TT: 持有次数限制

  MTT : 最大持有次数限制

分享到:
评论

相关推荐

    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性能调优监控工具jps、jstack、jmap、jhat、jstat使用详解.docx

    JVM性能调优监控工具jps、jstack、jmap、jhat、jstat使用详解 本文将对一些常用的 JVM 性能调优监控工具进行介绍,包括 jps、jstack、jmap、jhat、jstat 等工具的使用详解。这些工具对于 Java 程序员来说是必备的,...

    Kubernetes应用java程序无法使用jmap,jstack的解决方案.docx

    在 Kubernetes 环境中,运行 Java 程序时,无法使用 jmap 和 jstack 命令进行性能分析和诊断。这种情况下,无法获取 Java 进程的 pid,导致无法使用 jmap 和 jstack 命令。 解决方案: 1. 了解 Linux 特殊进程 在 ...

    Java线程Dump分析工具jstack解析及使用场景

    使用jstack进行线程分析时,还需要结合其他工具,如jconsole、jvisualvm等,以便全面理解应用程序的性能状况。同时,分析结果应与代码逻辑相结合,找出可能的性能瓶颈或异常情况,进而优化代码或调整系统配置。 总...

    JVM监控工具介绍.docx

    Java虚拟机(JVM)监控工具对于理解和优化Java应用程序的性能至关重要。这些工具可以帮助开发者诊断内存泄漏、监控垃圾收集(GC)活动、查看线程状态以及检查JVM配置。以下是几种常用的JVM监控工具的详细介绍: 1. ...

    Cubic java应用诊断工具.rar

    Java自带了许多诊断工具,例如JConsole、JVisualVM、jmap、jstack、jcmd等。这些工具都是非常常用的工具,它们可以帮助开发人员诊断Java应用程序的性能问题。其中,JConsole和JVisualVM是图形化工具,可以用来监控...

    Jstack分析工具——IBM Thread and Monitor Dump Analyzer for Java

    需要本地安装JDK并配置JAVA环境变量。 之后使用java -jar jca469.jar即可打开工具。 直接将dump出来的堆栈信息,打开,便可分析。

    Java性能监控工具

    `jconsole`和`jvisualvm`都是图形化的性能监控工具,它们提供了丰富的界面,可以实时监控Java应用的CPU使用、内存分配、线程状态等。`jvisualvm`还支持生成各种报告和分析堆内存转储。 `jhat`是一个命令行工具,...

    java诊断与调优常用命令jmap、jstack、jstat使用实战.pdf

    本文主要介绍了四个Java命令行工具:jps、jmap、jstack和jstat,它们是Java性能分析和故障排查的基础。 1. **jps (Java Process Status)**: 用于查看运行在本地机器上的Java进程ID,这对于其他命令来说是必需的输入...

    实战Java虚拟机——JVM故障诊断与性能优化.pdf

    4. **性能监控与调优工具**:JDK自带的一些工具,如jconsole、jvisualvm、jmap、jstack等,是JVM性能分析的重要辅助。书中可能详细讲解了这些工具的使用方法和分析技巧。 5. **JVM参数设置**:了解并合理设置JVM...

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

    jconsole是一个基于Java Management Extensions(JMX)的实时图形化监测工具,这个工具利用了内建到JVM里面的JMX指令来提供实时的性能和资源的监控,包括了Java程序的内存使用、Heap size、线程的状态、类的分配状态...

    JVM 性能调优监控工具 jps、jstack、jmap、jhat、jstat、hprof 使用详解.zip

    计算机技术、IT咨询、人工智能AI理论介绍,学习参考资料计算机技术、IT咨询、人工智能AI理论介绍,学习参考资料计算机技术、IT咨询、人工智能AI理论介绍,学习参考资料计算机技术、IT咨询、人工智能AI理论介绍,学习...

    输出java进程的jstack信息示例分享 通过线程堆栈信息分析java线程

    为了获取这些信息,我们可以使用jstack工具,它是Java开发工具包(JDK)的一部分,能够输出Java进程的线程堆栈跟踪信息。 jstack命令通常可以输出以下类型的信息: 1. 线程的完整堆栈跟踪,包括本地方法。 2. 显示...

    JDK自带调试工具doc

    本篇将详细介绍JDK自带的几个主要调试工具,包括`jmap`、`jstack`、`jconsole`,以及相关的文档资源。 1. `jmap`:这是一个用于诊断堆内存状况的工具。通过`jmap`,我们可以获取到堆内存的详细映射,包括对象分配...

    java性能调优工具命令大全.zip

    jvm性能调优工具命令大全.zip jps jstat jmap jhat jstack jinfo jps JVM Process Status Tool GChisto jvisualvm ...

    图形界面分析threadump_jstack分析工具_包含jdk

    标题中的“图形界面分析threadump_jstack分析工具_包含jdk”指的是一个专用于分析Java应用程序线程堆栈信息的工具,该工具具有图形用户界面,能够帮助开发者更直观地理解和解决程序中的线程问题。这个工具包含了JDK...

    通过jstack与jmap分析一次线上故障.pdf

    通过jstack与jmap分析一次线上故障.pdf

Global site tag (gtag.js) - Google Analytics