`
chenzehe
  • 浏览: 538195 次
  • 性别: 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虚拟机工具,如"visualvm_136",是开发者用于深入了解和优化Java应用性能的重要辅助工具。 VisualVM是一个强大的多合一JVM监控和分析工具,它由Oracle公司开发并随Java SDK一同提供。VisualVM提供了丰富的功能...

    java虚拟机各种版本

    Java虚拟机(JVM)是Java编程语言的核心组成部分,它为Java程序提供了跨平台的运行环境。Java程序在编写完成后,会被编译成字节码(.class文件),这些字节码可以在任何装有JVM的系统上运行,实现了“一次编写,到处...

    MSJVM 虚拟机 JAVA工具

    总的来说,虽然MSJVM曾经是Windows用户运行Java应用的重要工具,但由于其已不再维护,对于当前的Java开发和运行环境,选择现代的Java虚拟机更为明智。对于那些依赖旧版Java应用的用户,使用MSJVM可能是一种解决方案...

    MiniJavaVM—个Java虚拟机的设计和实现

    MiniJavaVM—个Java虚拟机的设计和实现 在本篇文章中,我们将详细介绍 MiniJavaVM 的设计和实现,包括其总体架构、功能、运行环境和开发工具,以及具体的实现步骤。 第一章绪论 Java 虚拟机(Java Virtual ...

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

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

    java虚拟机(微软版本) - java 虚拟机,微软版本,适合操作系统-windows.rar

    Java虚拟机(JVM)是Java编程语言的核心组成部分,它为Java程序提供了运行环境。微软版本的Java虚拟机是专为Windows操作系统设计的,使得在Windows系统上可以执行编译后的Java字节码(.class文件)。这个压缩包...

    深入java虚拟机 高清pdf 高清高清高清

    《深入Java虚拟机》这本书是Java开发者深入了解JVM(Java Virtual Machine)的必备经典之作。它详尽地探讨了Java虚拟机的工作原理、内存管理、类加载机制、字节码执行以及性能优化等多个核心主题,旨在帮助开发者...

    java虚拟机常用命令

    在Java虚拟机运行过程中,我们可能需要使用各种命令工具来监控和诊断可能出现的问题。以下是一些常用的JVM命令工具及其知识点。 1. jps命令 jps(JVM Process Status Tool)命令用于列出正在运行的Java虚拟机进程...

    安卓的JAVA虚拟机 简单实用

    **安卓的JAVA虚拟机:简单实用** 在移动操作系统领域,Android以其开源、灵活的特性深受开发者喜爱。在Android系统中,Java虚拟机(JAVA Virtual Machine,JVM)扮演着至关重要的角色,它使得开发者能够使用Java...

    Java虚拟机规范(SE 7中文版)

    在阅读这本书时,读者应当理解Java虚拟机规范本身不是一种性能分析工具,它不涉及程序的执行效率和具体实现细节。对于需要对Java虚拟机进行调优和性能分析的读者,应当在阅读完此书后,进一步研究相关的性能书籍和...

    实战JAVA虚拟机

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

    JAVA虚拟机解读入门

    《JAVA虚拟机解读入门》是一本面向初学者的指南,旨在带领读者深入理解Java虚拟机(JVM)的工作原理和内部机制。JVM是Java语言的核心组成部分,它为Java程序提供了一个跨平台的运行环境,使得“一次编写,到处运行”...

    实战java虚拟机

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

    深入理解嵌入式java虚拟机

    《深入理解嵌入式Java虚拟机》是一本专注于KVM(Kernel-based Virtual Machine)的权威教材,对于想要深入了解Java在嵌入式环境中的运行机制和技术的读者来说,这本书无疑是宝贵的资源。KVM是Linux内核中的一个模块...

    Java虚拟机规范PDF

    由于无法查看实际的图片和OCR扫描文字内容,我将基于标题和描述提供关于Java虚拟机(JVM)规范的详细知识点。 ### Java虚拟机规范知识点 #### 1. JVM概述 Java虚拟机是运行所有Java程序的抽象计算机,它遵循一定的...

    揭秘Java虚拟机-JVM设计原理与实现

    《揭秘Java虚拟机-JVM设计原理与实现》这本书深入探讨了Java虚拟机(JVM)的工作原理及其在Java编程中的核心地位。Java虚拟机是Java平台的核心组成部分,它负责执行字节码,为开发者提供了跨平台的运行环境。以下是...

    深入JAVA虚拟机第二版 Bill Venners著 曹晓钢 蒋靖译

    《深入JAVA虚拟机第二版》是由Bill Venners撰写,并由曹晓钢和蒋靖翻译的中文书籍。这本书是Java开发者必备的经典读物,它详细地解析了Java虚拟机(JVM)的工作原理,帮助读者深入理解Java程序的运行机制。尽管描述...

    Java虚拟机规范pdf

    总的来说,《Java虚拟机规范》不仅是一份对Java虚拟机实现进行约束的文档,而且是Java程序员理解Java语言细节和提升自身技术水平的重要工具。通过阅读和学习这本规范,程序员可以更深入地理解Java程序是如何在虚拟机...

    Java虚拟机的安装程序

    Java虚拟机(JVM)是Java编程语言的核心组成部分,它为Java程序提供了运行环境。Java虚拟机允许跨平台运行Java代码,实现“一次编写,到处运行”的目标。在这个场景中,我们关注的是“jre-1_5_0_08-windows-i586-p-s...

Global site tag (gtag.js) - Google Analytics