[size=large] 起因:在测试服务器RedHat中启动datacenter时,会概率性地出现卡壳现象,而之前的一个月每日更新测试环境并没有碰到此问题,由于没有任何异常信息显示且该问题又是该概率性的发生这下子可把我难住了。想到了应该是最近重构了工程所致,于是叫一位负责重构的师兄过来协助解决,只见同事观察了一下后键入了一些命令那个连上了Jconsole,在Jonsole的监控界面检测到了死锁现象,因此问题也就因此定位... ...
完事之后师兄打开了%JAVA_HOME%/bin目录,对里面的一些常用的jdk工具进行了简单的介绍并建议我去学学jdk工具的基本原理与使用。
1、JDK简介
JDK 是整个Java的核心,包括了Java运行环境(Java Runtime Envirnment),一堆Java工具和Java基础的类库(rt.jar)。
常用的JDK有Sun的JDK,IBM的JDK,原BEA的BEA公司的 Jrocket
2、JDK常用工具介绍
看了一下,bin目录下的jdk工具有四五十个的样子,全部掌握一方面是因为成本太高二则是因为没有太大必要(2/8原则仍然使用),现对常用的一些工具进行学习,其他工具待日后有需要时再去学习。如下是本人根据解释列举的一些自认为比较重要的工具... ...
javac.exe |
Java编译器,将Java源代码转换成字节码 |
Java.exe |
Java解释器,直接从类文件执行Java应用程序字节代码 |
Javadoc.exe |
根据Java源码及说明语句生成HTML文档 |
Jdb.exe |
Java调试器,可以逐行执行程序,设置断点和检查变量 |
Javah.exe |
产生可以调用Java过程的C过程,或建立能被Java程序调用的C过程的头文件 |
Javap.exe |
Java反汇编器,显示编译类文件中的可访问功能和数据,显示字节代码含 |
Jar.exe |
将Java类文件和其他资源文件捆绑成一个一的jar文件 |
native2ascii |
用于转换字符或者文件的编码格式 |
servertools |
为程序员提供了一个命令行接口,用于注册取消注册,启动,关闭一个服务 |
JConsole |
是一个基于JMX的GUI工具,用于连接正在运行的JVM,主要用于监控 |
jps |
jps查找当前用户的Java进程,注意:不是当前系统中的所有进程 |
jstack |
jstack打印所有的Java线程的堆栈跟踪信息 |
jstat |
显示一个测量(instrumented)Java HotSpot虚拟机的性能统计信息 |
jstatd |
是一个Java远程方法调用 (RMI)服务器应用程序-它监控测量Java HotSpot虚拟机的创建和终止并且提供一个接口来允许远程监控工具依附到运行于本地主机的JVM |
jmap |
打印出某个java进程(使用pid)内存,打印出某个java进程(使用pid)内存 |
3、JConsole学习
从Java 5开始 引入了 JConsole。JConsole 是一个内置 Java 性能分析器,可以从命令行或在 GUI shell 中运行。您可以轻松地使用 JConsole(或者,它更高端的 “近亲” VisualVM )来监控 Java 应用程序性能和跟踪 Java 中的代码。
A、 启动JConsole
A.1:如果是从命令行启动,使 JDK 在 PATH 上,运行 jconsole 即可。
A.2:如果从 GUI shell 启动,找到 JDK 安装路径,打开 bin 文件夹,双击 jconsole
B、 如何设置JAVA程序运行时可以被JConsolse连接分析
B.1:本地程序(相对于开启JConsole的计算机),无需设置任何参数就可以被本地开启的JConsole连接(Java SE 6开始无需设置,之前还是需要设置运行时参数 -Dcom.sun.management.jmxremote )
B.2: 2.无认证连接 (下面的设置表示:连接的端口为1234、无需认证就可以被连接)
-Dcom.sun.management.jmxremote.port=1234
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false
B.3:如果考虑到安全因素,需要认证,需要安全连接,也是可以搞定的。参考:
http://download.oracle.com/javase/6/docs/technotes/guides/management/agent.html#gdenv
C、 JConsole如何连接远程机器的JAVA程序
C.1: 被远程连接的主机可以采取如下做法
.命令行:
带上B.2中的参数运行Java程序
.Eclipse中:
C.2: 访问远程连接时
.命令行:
jconsole.exe 192.168.0.181:1234
.使用JConsole图形界面进行访问
恭喜你,此时就进入了JConsole的分析界面!
关于页面信息都很直观没什么好说的,值得一提的是对着图点击右键可以保存数据到CSV文件,以后可以使用其他工具来分析这些数据。
D、 JConsole使用实例
就有限的工作经验来说的话,JConsole比较多的用来分析应用服务器的性能,如Tomcat/Apusic/JBoss等。
监控服务器的配置方法:
编辑run.bat(win下)或者run.sh(Linux下),找到如下内容
set JAVA_OPTS=%JAVA_OPTS%,在其后加上B.2中所列的参数即可。
推荐使用升级版 JConsole 即 jvisualvm
4、 Jstat使用
jstat工具特别强大,有众多的可选项,详细查看堆内各个部分的使用量,以及加载类的数量。使用时,需加上查看进程的进程id,和所选参数。以下详细介绍各个参数的意义。
jstat -class pid:显示加载class的数量,及所占空间等信息。
jstat -compiler pid:显示VM实时编译的数量等信息。
jstat -gc pid:可以显示gc的信息,查看gc的次数,及时间。其中最后五项,分别是young gc的次数,young gc的时间,full gc的次数,full gc的时间,gc的总时间。
jstat -gccapacity:可以显示,VM内存中三代(young,old,perm)对象的使用和占用大小,如:PGCMN显示的是最小perm的内存使用量,PGCMX显示的是perm的内存最大使用量,PGC是当前新生成的perm内存占用量,PC是但前perm内存占用量。其他的可以根据这个类推, OC是old内纯的占用量。
jstat -gcnew pid:new对象的信息。
jstat -gcnewcapacity pid:new对象的信息及其占用量。
jstat -gcold pid:old对象的信息。
jstat -gcoldcapacity pid:old对象的信息及其占用量。
jstat -gcpermcapacity pid: perm对象的信息及其占用量。
jstat -util pid:统计gc信息统计。
jstat -printcompilation pid:当前VM执行的信息。
除了以上一个参数外,还可以同时加上 两个数字,如:jstat -printcompilation 3024 250 6是每250毫秒打印一次,一共打印6次,还可以加上-h3每三行显示一下标题。
5、 jmap使用
jmap 是一个可以输出所有内存中对象的工具,甚至可以将VM 中的heap,以二进制输出成文本。使用方法 jmap -histo pid。如果连用 SHELL jmap -histo pid>a.log可以将其保存到文本中去(windows下也可以使用),在一段时间后,使用文本对比工具,可以对比出GC回收了哪些对象。jmap -dump:format=b,file=f1 3024可以将3024进程的内存heap输出出来到f1文件里。
6、 jps的使用
jps [-q] [-mlvV] [<hostid>]
参数解释:
-p |
只显示pid,不显示class名称,jar文件名和传递给main 方法的参数 |
-m |
输出传递给main 方法的参数,在嵌入式jvm上可能是null |
-l |
输出应用程序main class的完整package名或者应用程序的jar文件完整路径名 |
-v |
输出传递给JVM的参数 |
hostid的定义为: ip:port
7、 关于对java性能的分析而言,JPofiler是个不错的选择。
它把CPU、执行绪和内存的剖析组合在一个强大的应用中。JProfiler可提供许多IDE整合和应用服务器整合用途。
JProfiler直觉式的GUI让你可以找到效能瓶颈、抓出内存漏失(memory leaks)、并解决执行绪的问题。它让你得以对heap walker作资源回收器的root analysis,可以轻易找出内存漏失;heap快照(snapshot)模式让未被参照(reference)的对象、稍微被参照的对象、或在终结(finalization)队列的对象都会被移除;整合精灵以便剖析浏览器的Java外挂功能。
如下是一个关于JProfiler使用入门的比较好的参考资料:
http://wenku.baidu.com/view/35909d5f312b3169a451a442.html
待日后需要时再去学习,那样学习效果会更好,标记Ing... ...
参考资料:
http://jiajun.iteye.com/blog/810150
http://jiajun.iteye.com/blog/443196
[/size]