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虚拟机工具,如"visualvm_136",是开发者用于深入了解和优化Java应用性能的重要辅助工具。 VisualVM是一个强大的多合一JVM监控和分析工具,它由Oracle公司开发并随Java SDK一同提供。VisualVM提供了丰富的功能...
Java虚拟机(JVM)是Java编程语言的核心组成部分,它为Java程序提供了跨平台的运行环境。Java程序在编写完成后,会被编译成字节码(.class文件),这些字节码可以在任何装有JVM的系统上运行,实现了“一次编写,到处...
总的来说,虽然MSJVM曾经是Windows用户运行Java应用的重要工具,但由于其已不再维护,对于当前的Java开发和运行环境,选择现代的Java虚拟机更为明智。对于那些依赖旧版Java应用的用户,使用MSJVM可能是一种解决方案...
MiniJavaVM—个Java虚拟机的设计和实现 在本篇文章中,我们将详细介绍 MiniJavaVM 的设计和实现,包括其总体架构、功能、运行环境和开发工具,以及具体的实现步骤。 第一章绪论 Java 虚拟机(Java Virtual ...
《实战Java虚拟机——JVM故障诊断与性能优化》内容简介:随着越来越多的第三方语言(Groovy、Scala、JRuby等)在Java虚拟机上运行,Java也俨然成为一个充满活力的生态圈。本书将通过200余示例详细介绍Java虚拟机中的...
Java虚拟机(JVM)是Java编程语言的核心组成部分,它为Java程序提供了运行环境。微软版本的Java虚拟机是专为Windows操作系统设计的,使得在Windows系统上可以执行编译后的Java字节码(.class文件)。这个压缩包...
《深入Java虚拟机》这本书是Java开发者深入了解JVM(Java Virtual Machine)的必备经典之作。它详尽地探讨了Java虚拟机的工作原理、内存管理、类加载机制、字节码执行以及性能优化等多个核心主题,旨在帮助开发者...
在Java虚拟机运行过程中,我们可能需要使用各种命令工具来监控和诊断可能出现的问题。以下是一些常用的JVM命令工具及其知识点。 1. jps命令 jps(JVM Process Status Tool)命令用于列出正在运行的Java虚拟机进程...
**安卓的JAVA虚拟机:简单实用** 在移动操作系统领域,Android以其开源、灵活的特性深受开发者喜爱。在Android系统中,Java虚拟机(JAVA Virtual Machine,JVM)扮演着至关重要的角色,它使得开发者能够使用Java...
在阅读这本书时,读者应当理解Java虚拟机规范本身不是一种性能分析工具,它不涉及程序的执行效率和具体实现细节。对于需要对Java虚拟机进行调优和性能分析的读者,应当在阅读完此书后,进一步研究相关的性能书籍和...
第6章介绍了Java虚拟机的性能监控和故障诊断工具。第7章详细介绍了对Java堆的分析方法和案例。第8章介绍了Java虚拟机对多线程,尤其是对锁的支持。第9~10章介绍了Java虚拟机的核心——Class文件结构,以及Java虚拟机...
《JAVA虚拟机解读入门》是一本面向初学者的指南,旨在带领读者深入理解Java虚拟机(JVM)的工作原理和内部机制。JVM是Java语言的核心组成部分,它为Java程序提供了一个跨平台的运行环境,使得“一次编写,到处运行”...
第6章介绍了Java虚拟机的性能监控和故障诊断工具。第7章详细介绍了对Java堆的分析方法和案例。第8章介绍了Java虚拟机对多线程,尤其是对锁的支持。第9~10章介绍了Java虚拟机的核心——Class文件结构,以及Java虚拟机...
《深入理解嵌入式Java虚拟机》是一本专注于KVM(Kernel-based Virtual Machine)的权威教材,对于想要深入了解Java在嵌入式环境中的运行机制和技术的读者来说,这本书无疑是宝贵的资源。KVM是Linux内核中的一个模块...
由于无法查看实际的图片和OCR扫描文字内容,我将基于标题和描述提供关于Java虚拟机(JVM)规范的详细知识点。 ### Java虚拟机规范知识点 #### 1. JVM概述 Java虚拟机是运行所有Java程序的抽象计算机,它遵循一定的...
《揭秘Java虚拟机-JVM设计原理与实现》这本书深入探讨了Java虚拟机(JVM)的工作原理及其在Java编程中的核心地位。Java虚拟机是Java平台的核心组成部分,它负责执行字节码,为开发者提供了跨平台的运行环境。以下是...
《深入JAVA虚拟机第二版》是由Bill Venners撰写,并由曹晓钢和蒋靖翻译的中文书籍。这本书是Java开发者必备的经典读物,它详细地解析了Java虚拟机(JVM)的工作原理,帮助读者深入理解Java程序的运行机制。尽管描述...
总的来说,《Java虚拟机规范》不仅是一份对Java虚拟机实现进行约束的文档,而且是Java程序员理解Java语言细节和提升自身技术水平的重要工具。通过阅读和学习这本规范,程序员可以更深入地理解Java程序是如何在虚拟机...
Java虚拟机(JVM)是Java编程语言的核心组成部分,它为Java程序提供了运行环境。Java虚拟机允许跨平台运行Java代码,实现“一次编写,到处运行”的目标。在这个场景中,我们关注的是“jre-1_5_0_08-windows-i586-p-s...