zoukankan      html  css  js  c++  java
  • 几个与JVM相关的JDK工具:jps, jstat, jmap

    在项目中遇到OOM(Out of Memory)的问题,为了分析内存和JVM的垃圾回收器GC问题,一并把JVM相关的一些工具也研究了一下:

    1. jps:Java进程查看工具,实际上它和Unix/Linux上面的ps命令的功能差不多
    2. jstat:Java内存使用情况监控工具
    3. jmap:输出JVM内存中对象的工具

    这些工具位于JAVA_HOME/bin目录下

    ?

    一,jps (Java Virtual Machine Process Status Tool) JVM进程状态工具

    jps用来查看host上运行的所有java进程的pid(lvmid),一般情况下使用这个工具的目的只是为了找出运行的jvm进程ID,即lvmid,然后可以进一步使用其它的工具来监控和分析JVM,因此可以说这个工具并没有太多的功能。

    如我本地只启动了visualVM,jps可以看到

    ?View Code TEXT
     
    1
    2
    
    2156 Jps
    1932 Main

    常用的几个参数:

    -l 输出java应用程序的main class的完整包

    -q 仅显示pid,不显示其它任何相关信息

    -m 输出传递给main方法的参数

    -v 输出传递给JVM的参数。在诊断JVM相关问题的时候,这个参数可以查看JVM相关参数的设置

    如使用 jps -l -v 命令可以输出如下

    ?View Code TEXT
     
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    
    C:OracleMiddlewarejdk160_05in>jps -l -v
    5780 sun.tools.jps.Jps
      -Dapplication.home=C:OracleMiddlewarejdk160_05 -Xms8m
     
    1932 org/netbeans/Main -Xms24m -Xmx192m
      -Dnetbeans.accept_license_class=com.sun.tools.visualvm.modules.startup.AcceptLicense
      -Dsun.jvmstat.perdata.syncWaitMs=10000
      -Djdk.home=C:/Oracle/Middleware/jdk160_05
      -Dnetbeans.home=D:Arone.Zhangjvmvisualvm_111platform9
      -Dnetbeans.dirs=D:Arone.Zhangjvmvisualvm_111visualvm;D:Arone.Zhangjvmvisualvm_111profiler3
      -Dnetbeans.user=C:UsersArone.ZhangAppDataRoaming.visualvm1.1.1
      -Dnetbeans.system_http_proxy=DIRECT
      -Dnetbeans.system_http_non_proxy_hosts=
      -Dsun.awt.keepWorkingSetOnMinimize=true

    ?

    jps的官方描述:http://java.sun.com/j2se/1.5.0/docs/tooldocs/share/jps.html

    ?

    二,jstat (Java Virtual Machine Statistics Monitoring Tool) JVM统计信息监控工具

    jstat根据lvmid来实时监控Java应用程序的资源和性能,包括jvm的heap size和GC的回收状况,比起jps工具jstat要强大得多,同时使用起来也较复杂。

    ?

    jstat有如下的生成结果选项(通过 jstat –options 来查看),jstat需要列出lvmid的统计信息,因此需要和jps配合使用

    -class :显示加载类和卸载类的数量、所占空间大小和加载类和卸载类所花的时间

    -compiler:显示VM实时编译的统计信息,包括编译任务执行的数量、编译任务失败的数量、变为无效的编译任务数量、执行编译任务所花费的时间等等

    -gc:显示GC的堆信息,包括存活区、新生代区、永久区、发生GC的次数和所花费的时间

    -gccapacity:显示JVM内存池中三代(young、old、perm)对象的使用和占用能力

    -gccause:这个和-gcutil选项一样都是显示GC统计信息的汇总信息,只是包括了最后GC事件和当前GC事件

    -gcnew:显示新生代对象的统计信息

    -gcnewcapacity:显示新生代对象的信息和占用量

    -gcold:显示老一代对象的统计信息

    -gcoldcapacity:显示老一代对象的信息和占用量

    -gcpermcapacity:显示永久代对象的信息和占用量

    -gcutil:显示GC统计信息的汇总信息

    -printcompilation:打印当前VM执行的信息

    ?

    此工具中涉及到的永久代、老一代和新生代的概念和jdk的GC算法有密切的关系,关于GC的内容请查看Tuning Garbage Collection with the 5.0 JavaTM Virtual Machine

    jstat使用的除了上面生成结果选项之外,还有收集统计信息的时间间隔和统计的次数,同时还可以控制输出结果的列标题如何出现。

    ?View Code TEXT
     
    1
    2
    3
    4
    5
    6
    7
    8
    
    C:OracleMiddlewarejdk160_05in>jstat -gcnew -t -h3 1932 30 5
    Timestamp        S0C    S1C    S0U    S1U   TT MTT  DSS      EC       EU     YGC     YGCT
            26638.9  192.0  192.0    0.0  192.0  1  15   96.0   1728.0   1472.7  12737   17.803
            26639.0  192.0  192.0    0.0  192.0  1  15   96.0   1728.0   1472.7  12737   17.803
            26639.0  192.0  192.0    0.0  192.0  1  15   96.0   1728.0   1472.7  12737   17.803
    Timestamp        S0C    S1C    S0U    S1U   TT MTT  DSS      EC       EU     YGC     YGCT
            26639.0  192.0  192.0    0.0  192.0  1  15   96.0   1728.0   1472.7  12737   17.803
            26639.1  192.0  192.0    0.0  192.0  1  15   96.0   1728.0   1472.7  12737   17.803

    ?

    上面的 -t 选项是用来打印timestamp,-hN选项是用来控制打印列标题,这个选项对于多屏输出结果的时候比较有用,因此上面的jstat -gcnew -t -h3 1932 30 5 代表针对lvmid为 1932 的Java进程收集新生代对象统计信息:包括打印时间戳、每隔3行打印一次标题、30ms统计一次、共统计5次

    每个选项输出列的含义请查看官方文档,jstat的官方描述:http://java.sun.com/j2se/1.5.0/docs/tooldocs/share/jstat.html

    虽然jstat提供了监控GC状态的强大功能,但是由于它是命令行,在实际问题的分析过程中难度比较高,因此市场上面出现了很多基于此命令的可视化工具,开源工具visualVM就是其中的佼佼者,JDK1.6之后,它已经包括在jdk中了。

    ?

    关于如何使用visualVM来可视化监控JVM状况,后续将整理相关的文章。

    ?

    三,jmap (Memory Map) JVM内存对象打印工具

    jmap根据lvmid来Java进程的内存所有对象

    ?

    首先根据选项打印出Java对象堆的直方图信息,包括Java类、类实例对象数量、在内存中占有量的大小以及类的完整包名,下面是缩减版本的直方图信息:

    ?View Code TEXT
     
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    
    C:OracleMiddlewarejdk160_05in>jmap -histo 3432
     
     num     #instances         #bytes  class name
    ----------------------------------------------
       1:         14644       20883096  [I
       2:         69176        7689640  
       3:        111994        6561320  [C
       4:         69176        5542192  
       5:          1933        4825592  [Ljavax.swing.text.GapContent$MarkData;
       6:        100440        4480456  
       7:          6506        3771008  
       8:         90461        3618440  org.openide.util.RequestProcessor$Item
       9:         90239        3609560  org.openide.util.RequestProcessor$EnqueueTask
    ......
    3315:             1              8  sun.misc.Launcher$Factory
    3316:             1              8  org.netbeans.core.windows.WindowSystemImpl
    3317:             1              8  javax.swing.filechooser.WindowsFileSystemView
    3318:             1              8  org.netbeans.ModuleFactory
    Total       1767075      103137272

    ?

    其次是将内存堆的信息dump成为一个二进制文件,供jhat这样的Java内存分析工具来使用,如下降Java内存对象堆dump为heap.bin文件:

    ?View Code TEXT
     
    1
    2
    3
    
    C:OracleMiddlewarejdk160_05in>jmap -dump:format=b,file=heap.bin 3432
    Dumping heap to C:OracleMiddlewarejdk160_05inheap.bin ...
    Heap dump file created

    命令运行完成之后,在同目录下会生成一个heap.bin二进制内存对象堆文件

    ?

    此工具使用比较简单,但是它对于分析内存溢出问题非常有用,目前有很多用来分析Java内存对象的工具,如收费的工具有:jprofiler,YourKit Java Profiler;而像Eclipse MAT则是优秀的内存对象分析开源工具,后续将整理相关的文章。

  • 相关阅读:
    Hadoop功能模块之hdfs
    Hadoop介绍
    大数据的介绍
    Hadoop之shell命令
    Flume
    C# DataTable使用方法详解
    npoi 操作excell 可以下载的链接
    node.js mqtt样例
    node.js压缩
    arcgis中打印所有变量的名称和值
  • 原文地址:https://www.cnblogs.com/jifeng/p/3805898.html
Copyright © 2011-2022 走看看