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

Java虚拟机工具

    博客分类:
  • JVM
 
阅读更多

1、jdk工具在linux中的安装,有些系统只安装了jre,并没装JDK,所以就没有jvm工具,一般安装目录在/usr/java或/usr/local/java目录下,可以使用下面方法查看:

[root@b2b ~]# whereis java
java: /usr/bin/java
[root@b2b ~]# ls -l /usr/bin/java
lrwxrwxrwx 1 root root 26 Apr 25  2012 /usr/bin/java -> /usr/java/default/bin/java
[root@b2b ~]# ls -l /usr/java/default/bin/java
-rwxr-xr-x 1 root root 7630 Jan 20  2012 /usr/java/default/bin/java
[root@b2b ~]# ls -l /usr/java/
total 4
lrwxrwxrwx 1 root root   16 Apr 25  2012 default -> /usr/java/latest
drwxr-xr-x 8 root root 4096 Apr 25  2012 jdk1.7.0_03
lrwxrwxrwx 1 root root   21 Apr 25  2012 latest -> /usr/java/jdk1.7.0_03
########################################################################
[tomcat@hs-32 ~]$ whereis java
java: /usr/bin/java /usr/share/java
[tomcat@hs-32 ~]$ ls -l /usr/bin/java
lrwxrwxrwx. 1 root root 26  3月 29 2012 /usr/bin/java -> /usr/java/default/bin/java
[tomcat@hs-32 ~]$ ls -l /usr/java/default/bin/java
-rwxr-xr-x. 1 root root 50794 11月 10 2011 /usr/java/default/bin/java
[tomcat@hs-32 ~]$ ls -l /usr/java/
总用量 4
lrwxrwxrwx. 1 root root   16  3月 29 2012 default -> /usr/java/latest
drwxr-xr-x. 7 root root 4096  3月 29 2012 jre1.6.0_30
lrwxrwxrwx. 1 root root   21  3月 29 2012 latest -> /usr/java/jre1.6.0_30

 

2、jps JVM Process Status Tool,显示指定系统内所有HotSpot虚拟机进程,使用jps -help可查看使用帮助

命令格式: jps [options] [hostid]

options有下面选项:

-q:只输出LVMID,省略主类的名称

-m:输出虚拟机启动时传递给主函数main()的参数

-l:输出主类名称,如果进程执行的是jar包,则输出jar包路径

-v:输出虚拟机进程启动时JVM参数

如:

[tomcat@hs-27 ~]$ /usr/java/jdk1.6.0_21/bin/jps 
22347 Bootstrap
4746 Bootstrap
22291 Bootstrap
25334 Jps
22232 Bootstrap
22174 Bootstrap
[tomcat@hs-27 ~]$ /usr/java/jdk1.6.0_21/bin/jps -q
22347
25348
4746
22291
22232
22174
[tomcat@hs-27 ~]$ /usr/java/jdk1.6.0_21/bin/jps -m
25363 Jps -m
22347 Bootstrap start
4746 Bootstrap start
22291 Bootstrap start
22232 Bootstrap start
22174 Bootstrap start
[tomcat@hs-27 ~]$ /usr/java/jdk1.6.0_21/bin/jps -l
22347 org.apache.catalina.startup.Bootstrap
4746 org.apache.catalina.startup.Bootstrap
25386 sun.tools.jps.Jps
22291 org.apache.catalina.startup.Bootstrap
22232 org.apache.catalina.startup.Bootstrap
22174 org.apache.catalina.startup.Bootstrap

 

3、jstat 用来监视VM内存内的各种堆和非堆的大小及其内存使用量

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

[root@b2b tomcat]# jstat -class 7970
Loaded  Bytes  Unloaded  Bytes     Time   
  5721 11433.3       12    20.1       5.78

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

[root@b2b tomcat]# jstat -compiler 7970  
Compiled Failed Invalid   Time   FailedType FailedMethod
    1560      1       0    21.96          1 org/apache/catalina/loader/WebappClassLoader findResourceInternal

     jstat -gc pid:可以显示gc的信息,查看gc的次数,及时间。其中最后五项,分别是young gc的次数,young gc的时间,full gc的次数,full gc的时间,gc的总时间。

[root@b2b tomcat]# jstat -gc 7970
 S0C    S1C    S0U    S1U      EC       EU        OC         OU       PC     PU    YGC     YGCT    FGC    FGCT     GCT   
10624.0 11200.0  0.0   4177.9 152064.0 107753.4  349568.0   11557.8   131072.0 43018.6    661    3.954  16      3.029    6.983

     jstat -gccapacity pid:可以显示,VM内存中三代(young,old,perm)对象的使用和占用大小,如:PGCMN显示的是最小perm的内存使用量,PGCMX显示的是perm的内存最大使用量,PGC是当前新生成的perm内存占用量,PC是但前perm内存占用量。其他的可以根据这个类推, OC是old内纯的占用量。

[root@b2b tomcat]# jstat -gccapacity 7970
 NGCMN    NGCMX     NGC     S0C   S1C       EC      OGCMN      OGCMX       OGC         OC      PGCMN    PGCMX     PGC       PC     YGC    FGC 
174720.0 174720.0 174720.0 10624.0 10368.0 153728.0   349568.0   349568.0   349568.0   349568.0 131072.0 131072.0 131072.0 131072.0    662    16

    jstat -gccause pid:统计gc的情况和引起gc的事件

[root@b2b tomcat]# jstat -gccause 7970
  S0     S1     E      O      P     YGC     YGCT    FGC    FGCT     GCT    LGCC                 GCC                 
 12.73   0.00  96.32   3.61  32.82    670    3.997    17    3.235    7.233 unknown GCCause      No GC  

    jstat -gcnew pid:new对象的信息。

[root@b2b tomcat]# jstat -gcnew 7970     
 S0C    S1C    S0U    S1U   TT MTT  DSS      EC       EU     YGC     YGCT  
9920.0 9600.0 1472.0    0.0  1  15 9600.0 155200.0  14609.6    664    3.963

    jstat -gcnewcapacity pid:new对象的信息及其占用量。

[root@b2b tomcat]# jstat -gcnewcapacity 7970
  NGCMN      NGCMX       NGC      S0CMX     S0C     S1CMX     S1C       ECMX        EC      YGC   FGC 
  174720.0   174720.0   174720.0   9920.0  58240.0  58240.0   9600.0   174592.0   155200.0   664    16

    jstat -gcold pid:old对象的信息。

[root@b2b tomcat]# jstat -gcold 7970        
   PC       PU        OC          OU       YGC    FGC    FGCT     GCT   
131072.0  43018.6    349568.0     11669.9    665    16    3.029    6.994

    jstat -gcoldcapacity pid:old对象的信息及其占用量。

[root@b2b tomcat]# jstat -gcoldcapacity 7970
   OGCMN       OGCMX        OGC         OC       YGC   FGC    FGCT     GCT   
   349568.0    349568.0    349568.0    349568.0   665    16    3.029    6.994

    jstat -gcpermcapacity pid:perm对象的信息及其占用量。

[root@b2b tomcat]# jstat -gcpermcapacity 7970   
  PGCMN      PGCMX       PGC         PC      YGC   FGC    FGCT     GCT   
  131072.0   131072.0   131072.0   131072.0   666    16    3.029    6.997

    jstat -gcutil pid:统计gc信息统计。

[root@b2b tomcat]# jstat -gcutil 7970
  S0     S1     E      O      P     YGC     YGCT    FGC    FGCT     GCT   
  0.00  99.56  96.43   3.63  32.82    675    4.057    17    3.235    7.293

     jstat -printcompilation pid:当前VM执行的信息。

[root@b2b tomcat]# jstat -printcompilation 7970 300 10    
Compiled  Size  Type Method
    1560    182    1 org/hibernate/event/def/DefaultFlushEntityEventListener logDirtyProperties
    1560    182    1 org/hibernate/event/def/DefaultFlushEntityEventListener logDirtyProperties
    1560    182    1 org/hibernate/event/def/DefaultFlushEntityEventListener logDirtyProperties
    1560    182    1 org/hibernate/event/def/DefaultFlushEntityEventListener logDirtyProperties
    1560    182    1 org/hibernate/event/def/DefaultFlushEntityEventListener logDirtyProperties
    1560    182    1 org/hibernate/event/def/DefaultFlushEntityEventListener logDirtyProperties
    1560    182    1 org/hibernate/event/def/DefaultFlushEntityEventListener logDirtyProperties
    1560    182    1 org/hibernate/event/def/DefaultFlushEntityEventListener logDirtyProperties
    1560    182    1 org/hibernate/event/def/DefaultFlushEntityEventListener logDirtyProperties
    1560    182    1 org/hibernate/event/def/DefaultFlushEntityEventListener logDirtyProperties

     除了以上一个参数外,还可以同时加上 两个数字,如:jstat -printcompilation 3024 250 6是每250毫秒打印一次,一共打印6次,还可以加上-h3每三行显示一下标题。 

 

4、jmp和jhat

jmap是一个很实用的轻量级工具。使用jmap可以查看heap空间的概要情况,粗略的掌握heap的使用情况。也可以生成heapdump文件,再使用jhat通过web浏览器具体分析内容中的对象和数据。

    jmap -heap pid:打印heap空间的概要,这里可以粗略的检验heap空间的使用情况

 

[root@b2b tomcat]# jmap -heap 8529
Attaching to process ID 8529, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 20.12-b01

using thread-local object allocation.
Parallel GC with 4 thread(s)

Heap Configuration:
   MinHeapFreeRatio = 40
   MaxHeapFreeRatio = 70
   MaxHeapSize      = 536870912 (512.0MB)
   NewSize          = 1310720 (1.25MB)
   MaxNewSize       = 17592186044415 MB
   OldSize          = 5439488 (5.1875MB)
   NewRatio         = 2
   SurvivorRatio    = 8
   PermSize         = 134217728 (128.0MB)
   MaxPermSize      = 134217728 (128.0MB)

Heap Usage:
PS Young Generation
Eden Space:
   capacity = 131006464 (124.9375MB)
   used     = 58065264 (55.37535095214844MB)
   free     = 72941200 (69.56214904785156MB)
   44.3224419827101% used
From Space:
   capacity = 24051712 (22.9375MB)
   used     = 5489424 (5.2351226806640625MB)
   free     = 18562288 (17.702377319335938MB)
   22.82342313096049% used
To Space:
   capacity = 23855104 (22.75MB)
   used     = 0 (0.0MB)
   free     = 23855104 (22.75MB)
   0.0% used
PS Old Generation
   capacity = 357957632 (341.375MB)
   used     = 11597336 (11.060081481933594MB)
   free     = 346360296 (330.3149185180664MB)
   3.2398627556011994% used
PS Perm Generation
   capacity = 134217728 (128.0MB)
   used     = 41566224 (39.64064025878906MB)
   free     = 92651504 (88.35935974121094MB)
   30.969250202178955% used
      以上的输出很简单,第四行起开始输出此进程我们的JAVA使用的环境。
      Heap Configuration,指在我们启动时设置的一些JVM参数。像最大使用内存大小,年老代,年青代,持久代大小等。
      Heap Usage,heap的实际使用情况。包括新生代、老生代和持久代。
      有这个可以很简单的查看本进程的内存使用情况。也许进程占用的总内存比较多,但我们在这里可以看到真正用到的并没有多少,很多都是"Free"。内存使用的堆积大多在老年代,内存池露始于此,所以要格外关心“Old Generation”。

    jmap -histo[:live]        to print histogram of java object heap; if the "live" suboption is specified, only count live objects 这里会生成一个类的统计报表,此表非常简单,如显示什么类有多少个实例,共占了多少字节等。如下:

[root@b2b ~]# jmap -histo 8529

 num     #instances         #bytes  class name
----------------------------------------------
   1:         59156        8680688  <constMethodKlass>
   2:         14266        8072448  [B
   3:         59156        8055024  <methodKlass>
   4:          5521        6045576  <constantPoolKlass>
   5:         97229        5698288  <symbolKlass>
   6:          7730        4557120  [I
   7:          5521        4287176  <instanceKlassKlass>
   8:         45028        4161304  [C
   9:          4443        3393816  <constantPoolCacheKlass>
  10:         46256        1480192  java.lang.String
  11:         33242        1063744  java.util.HashMap$Entry
  12:         10560         929280  java.lang.reflect.Method
  13:         26435         845920  jsr166y.LinkedTransferQueue$Node
  14:          1473         786952  <methodDataKlass>
  15:          6643         650504  [Ljava.util.HashMap$Entry;
  16:          6001         624104  java.lang.Class
  17:          7831         472400  [S
  18:          9171         453376  [[I
  19:          6687         267480  java.util.LinkedHashMap$Entry
  20:           451         263384  <objArrayKlassKlass>
  21:          6463         262400  [Ljava.lang.Object;
  22:          5285         253680  java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask
...... 

 

其中关于I、B、C等的说明如下:

BaseType Character Type Interpretation
B byte signed byte
C char Unicode character
D double double-precision floating-point value
F float single-precision floating-point value
I int integer
J long long integer
L<classname>; reference an instance of class de><classname>de>
S short signed short
Z boolean de>truede> or de>falsede>
[ reference one array dimension

 

    jmap -permstat pid:打印持久代上的内存使用状态,有“活”的,有“死”的。

    jmap -dump:format=b,file=xxx pid:导出heap信息,加上live为只导出“活”的对象

    jmap -dump:live,format=b,file=xxx pid。

 

jhat是一个Java堆复制浏览器。这个工具分析Java堆复制文件(例如,由上面的"jmap -dump"所产生的)。jhat启动一个允许堆中的对象在web浏览器中进行分析的web服务器。这个工具并不是想用于应用系统中而是用于"离线"分 析。"jhat工具是平台独立的",其意思是,它可以被用来观察在任何平台上所产生的堆复制。

导出后的映像文件可以用jhat来进行分析,-J是向java虚拟机传一个参数,如-mx768m是指定虚拟机可用最大的内存为768M。如果映像文件很大,你要指定一个很大的值,否则在分析过程中就会有OutOfMemeryError的错误。
jhat -J-mx768m -port <端口号:默认为7000> heap.dmp

执行后等待console中输出Started HTTP server on port 7000,看到后就可以通过浏览器访问http://ip:7000/了。此页面默认为按package分类显示系统中所有的对象实例。在页面的最下端有Other Queries导航,其中有显示jvm中对象实例个数的链接、有显示jvm中对象大小的链接等,点击显示jvm中对象大小的链接

 

 5、VisualVM

VisualVM是集成了多个JDK命令工具的一个可视化工具,它主要用来监控JVM的运行情况,可以用它来查看和浏览Heap Dump、Thread Dump、内存对象实例情况、GC执行情况、CPU消耗以及类的装载情况。Visualvm目前支持两种连接远程服务的方式,分别是jstatd和JMX方式,下面介绍下两种方式的连接。

jstatd方式,通过RMI服务器来实现的,因此需要在被监控的远程服务器上启动RMI服务,首先,配置java安全访问,创建名称为jstatd.all.policy的文件,可存在任意地方,内容为:

grant codebase "file:${java.home}/../lib/tools.jar" {
       permission java.security.AllPermission;
    };
 然后使用jstatd命令来启动RMI服务:
jstatd -J-Djava.security.policy=/home/tomcat/jvm/jstatd.all.policy -p 1993
 -Djava.security.policy为上面创建的文件,-p为服务端口,启动服务后,在VisualVM中添加远程主机,然后添加jstatd连接,使用上面设置的端口1993,连接成功后既可查看到远程主机JVM的运行状态,如堆区、栈区的分配空间和GC过程,但是使用jstatd方式连接不能监控到某些服务,如不能监控到CPU运行状态,不能Thread Dump和Head Dump等。

 

JMX连接方式

jmx连接远程的服务器,要想监控远程tomcat,必须在tomcat启动时同时开启jmx支持,设置端口以及授权信息等。修改tomcat bin目录下的catalina.sh中的JAVA_OPTS选项,如下所示:

 

JAVA_OPTS="-Xms1024m -Xmx1024m -Xss256K -XX:PermSize=128m -XX:MaxPermSize=128m -XX:SurvivorRatio=2 -XX:-UseGCOverheadLimit 
-Dcom.sun.management.jmxremote.port=1099 
-Dcom.sun.management.jmxremote.ssl=false 
-Dcom.sun.management.jmxremote.authenticate=false 
-Djava.rmi.server.hostname=192.168.0.252"
 其中hostname以及jmxremote相关的项就是设置JMX的连接信息,如上所示,连接IP是192.168.0.252,端口号是1099,并没有开启ssl和授权,在VisualVM的远程主机中添加一个JMX的连接就可以连接成功,能监控到CPU运行状态,Thread Dump和Head Dump等。

 

如果把jmx的信息配置在JAVA_OPTS中会引起一个问题,那就是tomcat关闭的时候总是提示 端口1099被占用而关闭不了。修改一下,把jmx配置在CATALINA_OPTS就可以了,如下所示:

JAVA_OPTS="-Xms1024m -Xmx1024m -Xss256K -XX:PermSize=128m -XX:MaxPermSize=128m -XX:SurvivorRatio=2 -XX:-UseGCOverheadLimit"
CATALINA_OPTS="-Dcom.sun.management.jmxremote.port=1099 
-Dcom.sun.management.jmxremote.ssl=false 
-Dcom.sun.management.jmxremote.authenticate=false 
-Djava.rmi.server.hostname=192.168.0.252"

 

 

分享到:
评论

相关推荐

    java虚拟机工具

    java虚拟机工具 测试系能,分析线程的好工具

    java虚拟机常用命令

    java虚拟机常用命令工具java虚拟机常用命令java虚拟机常用命令

    实战JAVA虚拟机

    第6章介绍了Java虚拟机的性能监控和故障诊断工具。第7章详细介绍了对Java堆的分析方法和案例。第8章介绍了Java虚拟机对多线程,尤其是对锁的支持。第9~10章介绍了Java虚拟机的核心——Class文件结构,以及Java虚拟机...

    实战java虚拟机

    第6章介绍了Java虚拟机的性能监控和故障诊断工具。第7章详细介绍了对Java堆的分析方法和案例。第8章介绍了Java虚拟机对多线程,尤其是对锁的支持。第9~10章介绍了Java虚拟机的核心——Class文件结构,以及Java虚拟机...

    后端JAVA虚拟机JVM调优必备工具

    IBM Thread and Monitor Dump Analyzer for Java专业JVM调优工具 一、使用方法 1.使用java -jar启动程序 2.找到需要分析的jvm进程 3.使用jstack [pid] &gt; /tmp/sdapjvmlog.txt导出进程的详细日志 4.使用程序打开...

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

    《实战Java虚拟机——JVM故障诊断与性能优化》内容简介:随着越来越多的第三方语言(Groovy、Scala、JRuby等)在Java虚拟机上运行,Java也俨然成为一个充满活力的生态圈。本书将通过200余示例详细介绍Java虚拟机中的...

    MSJVM 虚拟机 JAVA工具

    MSJVM工具,装JAVA虚拟机需要这个工具,不多介绍,下载试试吧,绝对好用

    Java虚拟机规范pdf

    java虚拟机实现的规范,对于底层运行原理的理解可以更深一层,是java程序员进阶的一大工具书,也可以增进对代码的理解。

    实战JAVA虚拟机 JVM故障诊断与性能优化

    本书将通过200余示例详细介绍Java虚拟机中的各种参数配置、故障排查、性能监控以及性能优化。  本书共11章。第1~3章介绍了Java虚拟机的定义、总体架构、常用配置参数。第4~5章介绍了垃圾回收的算法和各种垃圾回收器...

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

    第6章介绍了Java虚拟机的性能监控和故障诊断工具。第7章详细介绍了对Java堆的分析方法和案例。第8章介绍了Java虚拟机对多线程,尤其是对锁的支持。第9~10章介绍了Java虚拟机的核心——Class文件结构,以及Java虚拟机...

    自己动手写Java虚拟机 张秀宏 著

    1.2 java命令 1.3 编写命令行工具 1.4 测试本章代码 1.5 本章小结 第2章 搜索class文件 2.1 类路径 2.2 准备工作 2.3 实现类路径 2.3.1 Entry接口 2.3.2 DirEntry 2.3.3 ZipEntry 3 2.3.4 ...

    深入Java虚拟机(原书第2版)及书中源代码

    第5章 Java虚拟机 第6章 Java class文件 第7章 类型的生命周期 第8章 连接模型 第9章 垃圾收集 第10章 栈和局部变量操作 第11章 类型转换 第12章 整数运算 第13章 逻辑运算 第14章 浮点运算 第15章 对象和数组 第16...

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

    第6章介绍了Java虚拟机的性能监控和故障诊断工具。第7章详细介绍了对Java堆的分析方法和案例。第8章介绍了Java虚拟机对多线程,尤其是对锁的支持。第9~10章介绍了Java虚拟机的核心——Class文件结构,以及Java虚拟机...

    JAVA虚拟机(JavaVirtualMachine)V5.0中文官方安装版

    Java虚拟机(JVM)是Java Virtual Machine的缩写,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能模拟来实现的。Java虚拟机有自己完善的硬件架构,如处理器、堆栈、寄存器等,还具有相应的...

    java虚拟机的源代码(不是java库)

    NULL 博文链接:https://xuhuandh.iteye.com/blog/503948

    自己动手写Java虚拟机及class文件解析分析工具(java8运行)

    用go语言写的java虚拟机,主要是清楚的表达了jvm的原理。不懂go语言的其实也没关系,其中classpy这个可执行的jar文件,可以清楚的展现出class文件的结构

    java写的java虚拟机

    NULL 博文链接:https://taolei0628.iteye.com/blog/1259292

    Scala程序设计_Java虚拟机多核编程实战

    本书循序渐进地介绍了Scala的函数式编程基础,虽然篇幅短小,却切中要害。读者可以学会使用Scala静态语言的强大功能创建简洁、可扩展、...对于多核时代JVM上的并发编程,Scala是绝好的工具,而本书是你必不可少的向导。

    java虚拟机java必不可少的工具

    java虚拟机是java必不可少的工具,大家需要的下载用试试

    JVM(Java虚拟机)

    JVM(Java虚拟机)的整个流程:发展,运行区域,垃圾回收器,内存分配策略,垃圾收集,JVM分析工具,JVM优化

Global site tag (gtag.js) - Google Analytics