JVM(7)--java内置工具使用

来源:互联网 发布:linux vim复制多少行 编辑:程序博客网 时间:2024/06/06 14:02

全文转载自:http://blog.csdn.net/fenglibing/article/details/6411940 尊重原创。

javah

javah命令(C Header and Stub File Generator)

javah是用于根据JAVA本地方法,生成对应的c语言头文件及相应的stub文件的命令,使用比较简单。

jps

jps命令(Java Virtual Machine Process Status Tool)

1、介绍
用来查看基于HotSpot的JVM里面中,所有具有访问权限的Java进程的具体状态, 包括进程ID,进程启动的路径及启动参数等等,与unix上的ps类似,只不过jps是用来显示java进程,可以把jps理解为ps的一个子集。
使用jps时,如果没有指定hostid,它只会显示本地环境中所有的Java进程;如果指定了hostid,它就会显示指定hostid上面的java进程,不过这需要远程服务上开启了jstatd服务,可以参看前面的jstatd章节来启动jstad服务。

2、命令格式
jps [ options ] [ hostid ]

3、常用参数说明

  • -q 忽略输出的类名、Jar名以及传递给main方法的参数,只输出pid。
  • -m 输出传递给main方法的参数,如果是内嵌的JVM则输出为null。
  • -l 输出应用程序主类的完整包名,或者是应用程序JAR文件的完整路径。
  • -v 输出传给JVM的参数。
  • -V 输出通过标记的文件传递给JVM的参数(.hotspotrc文件,或者是通过参数-XX:Flags=指定的文件)。
  • -J 用于传递jvm选项到由javac调用的java加载器中,例如,“-J-Xms48m”将把启动内存设置为48M,使用-J选项可以非常方便的向基于Java的开发的底层虚拟机应用程序传递参数。
  • 4、服务器标识
    hostid指定了目标的服务器,它的语法如下:
    [protocol:][[//]hostname][:port][/servername]
    protocol - 如果protocol及hostname都没有指定,那表示的是与当前环境相关的本地协议,如果指定了hostname却没有指定protocol,那么protocol的默认就是rmi。
    hostname - 服务器的IP或者名称,没有指定则表示本机。
    port - 远程rmi的端口,如果没有指定则默认为1099。
    Servername - 注册到RMI注册中心中的jstatd的名称。

    5、使用示例
    5.1、列出本地的Java进程
    不带任何参数
    fenglibin@libin:~$ jps
    11644 Main
    1947
    12843 Jps
    带-v参数

    fenglibin@libin:~$ jps -v
    11644 Main -agentlib:jdwp=transport=dt_socket,suspend=y,address=localhost:43467 -Dfile.encoding=GBK
    1947 -Dosgi.requiredJavaVersion=1.5 -XX:MaxPermSize=256m -Xms40m -Xmx512m
    12858 Jps -

    Denv.class.path=/home/fenglibin/java6/lib/dt.jar:/home/fenglibin/java6/lib/tools.jar::/usr/bin/libtool:/usr/bin/autoconf:/usr/local/BerkeleyDB.4.8/lib -Dapplication.home=/home/fenglibin/java6 -Xms8m
    带-l参数

    fenglibin@libin:~$ jps -l
    11644 com.alibaba.china.webww.core.Main
    12870 sun.tools.jps.Jps
    1947

    5.2、列出远程的Java进程
    在jstatd章节,我们有通过:
    rmiregistry 2020&jstatd -J-Djava.security.policy=all.policy -p 2020 -n AlternateJstatdServerName
    启动了名为AlternateJstatdServerName的jstatd服务,那么我们此时就可以通过该服务列出其有权限访问的Java进程。

    fenglibin@libin:~$ jps 10.1.1.234:2020/AlternateJstatdServerName
    29556 Bootstrap
    28671 WSPreLauncher
    2602 RegistryImpl
    18272 Test
    2603 Jstatd

    jstack

    jstack命令(Java Stack Trace)

    1、介绍
    jstack用于打印出给定的java进程ID或core file或远程调试服务的Java堆栈信息,如果是在64位机器上,需要指定选项”-J-d64”,Windows的jstack使用方式只支持以下的这种方式:
    jstack [-l] pid
    如果java程序崩溃生成core文件,jstack工具可以用来获得core文件的java stack和native stack的信息,从而可以轻松地知道java程序是如何崩溃和在程序何处发生问题。另外,jstack工具还可以附属到正在运行的java程序中,看到当时运行的java程序的java stack和native stack的信息, 如果现在运行的java程序呈现hung的状态,jstack是非常有用的。
    2、命令格式
    jstack [ option ] pid
    jstack [ option ] executable core
    jstack [ option ] [server-id@]remote-hostname-or-IP
    3、常用参数说明
    1)、options:
    executable Java executable from which the core dump was produced.
    (可能是产生core dump的java可执行程序)
    core 将被打印信息的core dump文件
    remote-hostname-or-IP 远程debug服务的主机名或ip
    server-id 唯一id,假如一台主机上多个远程debug服务
    2)、基本参数:

  • -F当’jstack [-l] pid’没有相应的时候强制打印栈信息
  • -l长列表. 打印关于锁的附加信息,例如属于java.util.concurrent的ownable synchronizers列表.
  • -m打印java和native c/c++框架的所有栈信息.
  • -h | -help打印帮助信息
    pid 需要被打印配置信息的java进程id,可以用jps查询.
    4、使用示例
    这里写图片描述
  • jstat

    jstat命令(Java Virtual Machine Statistics Monitoring Tool)

    1、介绍
    Jstat用于监控基于HotSpot的JVM,对其堆的使用情况进行实时的命令行的统计,使用jstat我们可以对指定的JVM做如下监控:

  • - 类的加载及卸载情况
  • - 查看新生代、老生代及持久代的容量及使用情况
  • - 查看新生代、老生代及持久代的垃圾收集情况,包括垃圾回收的次数及垃圾回收所占用的时间
  • - 查看新生代中Eden区及Survior区中容量及分配情况等
    jstat工具特别强大,它有众多的可选项,通过提供多种不同的监控维度,使我们可以从不同的维度来了解到当前JVM堆的使用情况。详细查看堆内各个部分的使用量,使用的时候必须加上待统计的Java进程号,可选的不同维度参数以及可选的统计频率参数。
    它主要是用来显示GC及PermGen相关的信息,如果对GC不怎么了解,先看这篇文章:http://blog.csdn.net/fenglibing/archive/2011/04/13/6321453.aspx,否则其中即使你会使用jstat这个命令,你也看不懂它的输出。
  • 2、语法
    jstat [ generalOption | outputOptions vmid [interval[s|ms] [count]] ]
    generalOption - 单个的常用的命令行选项,如-help, -options, 或 -version。
    outputOptions -一个或多个输出选项,由单个的statOption选项组成,可以和-t, -h, and -J等选项配合使用。
    statOption:
    根据jstat统计的维度不同,可以使用如下表中的选项进行不同维度的统计,不同的操作系统支持的选项可能会不一样,可以通过-options选项,查看不同操作系统所支持选项,如:

    Option Displays…class 用于查看类加载情况的统计compiler 用于查看HotSpot中即时编译器编译情况的统计gc 用于查看JVM中堆的垃圾收集情况的统计gccapacity 用于查看新生代、老生代及持久代的存储容量情况gccause 用于查看垃圾收集的统计情况(这个和-gcutil选项一样),如果有发生垃圾收集,它还会显示最后一次及当前正在发生垃圾收集的原因。gcnew 用于查看新生代垃圾收集的情况gcnewcapacity 用于查看新生代的存储容量情况gcold 用于查看老生代及持久代发生GC的情况gcoldcapacity 用于查看老生代的容量gcpermcapacity 用于查看持久代的容量gcutil 用于查看新生代、老生代及持代垃圾收集的情况printcompilation HotSpot编译方法的统计

    -h n
    用于指定每隔几行就输出列头,如果不指定,默认是只在第一行出现列头。

    -J javaOption
    用于将给定的javaOption传给java应用程序加载器,例如,“-J-Xms48m”将把启动内存设置为48M。如果想查看可以传递哪些选项到应用程序加载器中,可以相看如下的文档:
    Linux and Solaris:http://docs.oracle.com/javase/1.5.0/docs/tooldocs/solaris/java.html
    Windows: http://docs.oracle.com/javase/1.5.0/docs/tooldocs/windows/java.html
    -t n
    用于在输出内容的第一列显示时间戳,这个时间戳代表的时JVM开始启动到现在的时间(注:在IBM JDK5中是没有这个选项的)。

    vmid - VM的进程号,即当前运行的java进程号。

    还有两个关于显示频率的选项:

    interval–间隔时间,单位可以是秒或者毫秒,通过指定s或ms确定,默认单位为毫秒。
    count-打印次数,如果缺省则打印无数次。

        -class

    类加载情况的统计列名说明Loaded加载了的类的数量Bytes加载的类的大小,单为KbUnloaded卸载了的类的数量Bytes的类的大小,单为KbTime花在类的加载及的时间

         -compiler

    HotSpot中即时编译器编译情况的统计 列名说明Compiled编译任务执行的次数Failed编译任务执行失败的次数Invalid编译任务非法执行的次数Time执行编译花费的时间FailedType最后一次编译失败的编译类型FailedMethod最后一次编译失败的类名及方法名

         -gc

    JVM中堆的垃圾收集情况的统计列名说明S0C新生代中Survivor spaceS0当前容量的大小KB)S1C新生代Survivor spaceS1当前容量的大小KB)S0U新生代Survivor spaceS0容量使用的大小KB)S1U新生代Survivor spaceS1容量使用的大小KB)ECEden space当前容量的大小KB)EUEden space容量使用的大小KB)OCOld space当前容量的大小KB)OUOld space使用容量的大小KB)PCPermanent space当前容量的大小KB)PUPermanent space使用容量的大小KB)YGC从应用程序启动到采样时发生 Young GC 的次数YGCT从应用程序启动到采样时 Young GC 所用的时间(秒)FGC从应用程序启动到采样时发生 Full GC 的次数FGCT从应用程序启动到采样时 Full GC 所用的时间(秒)GCTT从应用程序启动到采样时用于垃圾回收的总时间(单位秒),它的值等于YGC+FGC

        -gccapacity

    新生代、老生代及持久代的存储容量情况 列名说明NGCMN新生代的最小容大小KB)NGCMX新生代的最大容大小KB)NGC当前新生代的容大小KB)S0C当前新生代中survivor space 0的容量大小KB)S1C当前新生代中survivor space 1的容量大小KB)ECEden space当前容量的大小KB)OGCMN老生代的最小容大小KB)OGCMX老生代的最大容大小KB)OGC当前老生代的容大小KB)OC当前老生代的空间大小KB)PGCMN持久代的最小容大小KB)PGCMX持久代的最大容大小KB)PGC当前持久代的容大小KB)PC当前持久代的空间容大小KB)YGC从应用程序启动到采样时发生 Young GC 的次数FGC从应用程序启动到采样时发生 Full GC 的次数

        -gccause

         这个选项用于查看垃圾收集的统计情况(这个和-gcutil选项一样),如果有发生垃圾收集,它还会显示最后一次及当前正在发生垃圾收集的原因,它比-gcutil会多出最后一次垃圾收集原因以及当前正在发生的垃圾收集的原因。

    用于查看垃圾收集的统计情况,包括最近发生垃圾的原因 列名说明LGCC最后一次垃圾收集的原因,可能为unknown GCCause”、“System.gc()”等GCC当前垃圾收集的原因

        -gcnew

    新生代垃圾收集的情况列名说明S0C当前新生代中survivor space 0的容量大小(KB)S1C当前新生代中survivor space 1的容量大小KB)S0US0已经使用的大小KB)S1US1已经使用的大小KB)TTTenuring threshold,要了解这个参数,我们需要了解一点Java内存对象的结,在Sun JVM中,(除了数组之外的)对象都有两个机器字(words)的头部。第一个字中包含这个对象的标示哈希码以及其他一些类似锁状态和等标识信息,第二个字中包含一个指向对象的类的引用,其中第二个字节就会被垃圾收集算法使用到。
    在新生代中做垃圾收集的时候,每次复制一个对象后,将增加这个对象的收集计数,当一个对象在新生代中被复制了一定次数后,该算法即判定该对象是长周期的对象,把他移动到老生代,这个阈值叫着tenuring threshold。这个阈值用于表示某个/些在执行批定次数youngGC后还活着的对象,即使此时新生的的Survior没有满,也同样被认为是长周期对象,将会被移到老生代中。MTTMaximum tenuring threshold,用于表示TT的最大值。DSSDesired survivor size (KB).可以参与这里:http://blog.csdn.net/yangjun2/article/details/6542357
    ECEden space当前容量的大小(KB)EUEden space已经使用的大小(KB)YGC从应用程序启动到采样时发生 Young GC 的次数YGCT从应用程序启动到采样时 Young GC 所用的时间(单位秒)

        -gcnewcapacity

    新生代的存储容量情况列名说明NGCMN          新生代的最小容大小KB)NGCMX    新生代的最大容大小KB)NGC    当前新生代的容大小KB)S0CMX新生代中SO的最大容大小KB)S0C当前新生代中SO的容大小KB)S1CMX新生代中S1的最大容大小KB)S1C当前新生代中S1的容大小KB)ECMX新生代中Eden的最大容大小KB)EC当前新生代中Eden的容大小KB)YGC从应用程序启动到采样时发生 Young GC 的次数FGC从应用程序启动到采样时发生 Full GC 的次数

        -gcold

    老生代及持久代发生GC的情况列名说明PC当前持久代量的大小KB)PU久代使用量的大小KB)OC当前老年量的大小KB)OU老年代使用量的大小KB)YGC从应用程序启动到采样时发生 Young GC 的次数FGC从应用程序启动到采样时发生 Full GC 的次数FGCT从应用程序启动到采样时 Full GC 所用的时间(单位秒)GCT从应用程序启动到采样时用于垃圾回收的总时间(单位秒),它的值等于YGC+FGC

        -gcoldcapacity

    老生代的存储容量情况列名说明OGCMN老生代的最小容量大小(KB)OGCMX老生代的最大容量大小(KB)OGC当前老生代的容大小KB)OC当前新生代的空间大小KB)YGC从应用程序启动到采样时发生 Young GC 的次数FGC从应用程序启动到采样时发生 Full GC 的次数FGCT从应用程序启动到采样时 Full GC 所用的时间(单位秒)GCT从应用程序启动到采样时用于垃圾回收的总时间(单位秒),它的值等于YGC+FGC

        -gcpermcapacity

        从应用程序启动到采样时发生 Full GC 的次数持久代的存储容量情况列名说明PGCMN持久代的最小容量大小(KB)PGCMX持久代的最大容量大小(KB)PGC当前持久代的容大小KB)PC当前持久代的空间容大小KB)YGC从应用程序启动到采样时发生 Young GC 的次数FGCFGCT从应用程序启动到采样时 Full GC 所用的时间(单位秒)GCT从应用程序启动到采样时用于垃圾回收的总时间(单位秒),它的值等于YGC+FGC

        -gcutil

    新生代、老生代及持代垃圾收集的情况列名说明S0Heap上的 Survivor space 0 区已使用空间的百分比S1Heap上的 Survivor space 1 区已使用空间的百分比EHeap上的 Eden space 区已使用空间的百分比OHeap上的 Old space 区已使用空间的百分比PPerm space 区已使用空间的百分比YGC从应用程序启动到采样时发生 Young GC 的次数YGCT从应用程序启动到采样时 Young GC 所用的时间(单位秒)FGC从应用程序启动到采样时发生 Full GC 的次数FGCT从应用程序启动到采样时 Full GC 所用的时间(单位秒)GCT从应用程序启动到采样时用于垃圾回收的总时间(单位秒),它的值等于YGC+FGC

        -printcompilation

    HotSpot编译方法的统计列名说明Compiled编译任务执行的次数Size方法的字节码所占的字节数Type编译类型Method指定确定被编译方法的类名及方法名,类名中使名“/”而不是“.”做为命名分隔符,方法名是被指定的类中的方法,这两个字段的格式是由HotSpot中的“-XX:+PrintComplation”选项确定的。


    4、使用示例

    示例1)、

    示例2

     

    图中同时打印了young gcfull gc的总次数、总耗时。而,每次young gc消耗的时间,可以用相间隔的两行YGCT相减得到。每次full gc消耗的时间,可以用相隔的两行FGCT相减得到。例如红框中表示的第一行、第二行之间发生了1young gc,消耗的时间为0.252-0.2520.0秒。

    常驻内存区(P)的使用率,始终停留在64.21%左右,说明常驻内存没有突变,比较正常。如果youngnbsp;gcfull gc能够正常发生,而且都能有效回收内存,常驻内存区变化不明显,则说明java内存释放情况正常,垃圾回收及时,java内存泄露的几率就会大大降低。但也不能说明一定没有内存泄露。

    示例3)、

        以上,介绍了Jstat按百分比查看gc情况的功能。其实,它还有功能,例如加载类信息统计功能、内存池信息统计功能等,那些是以绝对值的形式打印出来的,比较少用,在此就不做介绍。

    示例4)、jstat -class pid:显示加载class的数量,及所占空间等信息。

     示例5)、jstat -compiler pid:显示VM实时编译的数量等信息。

    示例6)、查看远程服务器上的GC情况

        这个需要先在远程服务器上面开启jstatd服务,可以选看这里如何开启jstatd服务,http://blog.csdn.net/fenglibing/article/details/17323515

        下面是一个执行示例:

    C:\Documents and Settings\Administrator>jstat -gcutil 18272@the_ip:2021/jstatdName 1000

      S0     S1     E      O      P     YGC     YGCT    FGC    FGCT     GCT
      0.00   0.00   8.00   0.00  24.36      0    0.000     0    0.000    0.000
      0.00   0.00   8.00   0.00  24.36      0    0.000     0    0.000    0.000
      0.00   0.00   8.00   0.00  24.36      0    0.000     0    0.000    0.000
      0.00   0.00   8.00   0.00  24.36      0    0.000     0    0.000    0.000
      0.00   0.00   8.00   0.00  24.36      0    0.000     0    0.000    0.000
      0.00   0.00   8.00   0.00  24.36      0    0.000     0    0.000    0.000

        示例就不一一例举,有兴趣的可以自己尝试尝试。


    Oracle上关于Jstat的使用说明:http://docs.oracle.com/javase/1.5.0/docs/tooldocs/share/jstat.html




    0 0
    原创粉丝点击