今天看了书,《深入理解JAVA虚拟机JVM高级特性与最佳实践》的第四章——“虚拟机性能监控与故障处理工具”
书上介绍了JDK的6个命令工具和2个可视化的故障处理工具。 今天我就来一一试试,看是不是真的像书上的说那么神奇。 不过书上也说了,Linux下可以查看的命令和使用的功能更全面,Windows下很多命令不支持。嗯,今天先试试Windows下的水,改天装了Linux再试一下。
一、概述
1、给一个系统定位问题的时候,需要的数据常包括:运行日志、异常堆栈、GC日志、线程快照、堆转储快照等。
2、监控工具使用JAVA代码实现的原因是:当应用程序部署到生产环境后,无论是直接接触物理服务器还是远程Telnet到服务器上,都可能会受到限制。使用JAVA代码实现,把真实的实现放到.tools类库中实现,可以实现直接在应用程序中监测分析的功能!
二、6大命令工具
1、jps
JVMProcess Status 虚拟机进程状况工具:列出正在运行的虚拟机进程,并显示虚拟机执行主类名称以及进程的本地虚拟机的唯一ID。
对于本地JVM来说,LVMID(Local VirtualMachine Identifer)与操作系统的进程ID(ProcessIdentifier, PID)是一致的。
下面就来试试:【jsp执行样例】
(这里还出了一个小插曲,我一直以为这个l是1,然后cmd给我报错说illegalargument…尴尬…)
上面是jsp的常见选项:
-l 输出主类的全名 |
-m 输出JVM进程启动时传递给main()的参数 |
-q 输出LVMID |
-v 输出JVM启动时的参数 |
2、jstat
JVM StatisticsMonotoring Tool 虚拟机统计信息监视工具:纯文本状态下监视JVM各种运行状态信息。
如果是本地JVM,VMID与LVMID是一致的,如果是远程JVM进程,VMID的格式应该是 [protocol:] [//]lvmid[@hostname[:port]/servername]
主要查询3类信息:
-class 类装载
-gc 垃圾收集
-compiler 运行期编译情况
下面是在cmd里面查看的情况,这里我开了一个java的LVMID是9088,现在通过jstat来查询一下:
可以看到,更改代码之后,YGC了3次,使用时间YGCT=0.006秒。
3、jinfo
Configurationinfo for java JAVA配置信息工具:实时查看和调整JVM各项参数。
Jinfo对Windows平台的限制较大,JDK1.6只提供了-flag选项。先试试这个jinfo吧!先可以使用 java –XX:+PrintFlagsFinal查看参数的默认值:
然后使用jinfo 中间的CMS…是查询该CMS…的参数值
4、jmap
Memory Map for JAVA 内存映像工具:用于生成dump文件(堆转储快照)。
Jmap对windows也有限制,只能使用-dump查看每个类的实例、空间占用统计的-histo。其他的查询finalize执行队列、java堆和永久代的空间使用率、使用的收集器等只能在Linux下使用。
在该目录下生成了一个名为 eclipse.bin 的bin文件。
5、jhat
JVM Heap Analysis Tool 虚拟机堆转储快照分析工具:用来分析jmap生成的dump的。 但是一般不用这个(因为后面会讲VisualVM)
6、jstack
Stack Trace for JAVA 堆栈跟踪工具:生成JVM的javacore文件(当前时刻的线程快照)。
生成线程快照的主要目的是定位线程出现长时间停顿的原因,如线程间死锁、死循环、请求外部资源导致的长时间等待。
Jstack的大部分功能都可以用getAllStackTraces()方法来获取所有线程的stacktraceelement对象来实现。
明天接着介绍两个可视化工具吧!