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"