JVM性能监控学习总结
1. JPS:JVM ProcessTool,显示指定系统内所有的HotSpot虚拟机进程。(会将所有的JVM实例进程都打出来)问题:当用jps 打印JVM进程实例信息的时候,发现只打印出了jps自己的这个进程,通过查询文档发现jps 只能打印当前用户启动的线程,所以需要通过sudo –u admin切换到admin账户或者sudo才能使用jps打印出tomcat进程。2.
1. JPS:JVM ProcessTool,显示指定系统内所有的HotSpot虚拟机进程。(会将所有的JVM实例进程都打出来)
问题:当用jps 打印JVM进程实例信息的时候,发现只打印出了jps自己的这个进程,通过查询文档发现jps 只能打印当前用户启动的线程,所以需要通过sudo –u admin切换到admin账户或者sudo才能使用jps打印出tomcat进程。
2. 对于本地虚拟机进程来说,LVMID与操作系统的进程ID(PID,Process Identifier)是一致的,使用Windows的任务管理器或Unix的ps命令也可以查询到虚拟机进程的LVMID。
3. Jstat: (JVM StatisticsMonitoring Tool) 使用于监视虚拟机各种运行状态信息的命令行工具。它可以显示本地或者远程进程中的类装载,内存,垃圾收集,JIT编译等运行数据。
4. 对于命令行格式中的VMID和LVMID在本地虚拟机上是一致的,如果是远程虚拟机进程,VMID的格式应该是:[protocol:][//]lvmid[@hostname[:port]/servername]
5. Jstat 命令格式 jstat[option vmid [interval] [s|ms] [count]]]
6. Jstat –gc 显示的各个字段的含义。{@linkhttp://blog.csdn.net/lantian0802/article/details/9413395}
7. Jstat –gcutil 各个字段的含义:
8. Jinfo(Configuration info forjava) 的作用是实时的查看和调整虚拟机的各项参数。
9. 使用jps –v 参数可以看到虚拟机启动时显式指定的参数列表,但如果想知道未被显示指定的系统参数的默认值,除了去找资料外,就只能使用jinfo的-flag选项进行查询了。
10. Jmap(Memeory Map for java) 命令用于生成堆转储快照(一般称为heapdump或者dump文件)
11. 如果不使用jmap命令,要想获取java堆转储快照还有一些比较暴力的手段,比如通过设置-XX:HeapDumpOnOutOfMemoryError参数,可以让虚拟机在OOM异常出现之后自动生成dump文件,通过-XX:HeapDumpOnCtrlBreak参数则可以使用ctrl+break键让虚拟机生成dump文件,又或者在Linux系统下通过Kill -3命令发送进程退出信号 “恐吓”一下虚拟机,也可以拿到dump文件。
我们的daily服务器上是指定了这个参数的。
12. Jhat(JVM heapAnalysis Tool):虚拟机堆转储快照分析工具
13. Jhat命令和jmap搭配使用,来分析jmap生成的堆转储快照。
14. 比较流行的内存分析工具:VisualVM,Eclipse Memory Analyzer, IBM HeapAnalyzer等。
15. Jstack(Stack Trace for java) 命令用于生成虚拟机当前时刻的线程快照(一般称为threaddump或javacore文件)。线程的快照就是当前虚拟机内每一条线程正在执行的方法堆栈的集合,生成线程快照的主要目的定位线程出现长时间停顿的原因,如果线程间死锁,死循环,请求外部资源导致长时间等待都是导致线程长时间停顿的原因。
16. 在JDK1.5中,java.lang.Thread类新增了一个getAllStackTraces()方法用于获取虚拟机中所有线程的StackTraceElement对象。使用这个方法可以通过简单的几行代码就完成jstack的大部分功能,在实际项目中不妨调用这个方法做个管理员页面,可以随时使用浏览器来查看线程堆栈。
17. JConsole和VisualVM是两个JDK的强大的可视化工具。
18. JConsole是一款基于JMX的可视化监视和管理工具。它管理部分的功能是针对JMX MBean进行管理。
19. 通过JDK/bin目录下的jconsole.exe 启动JConsole后,将自动搜索出本机运行的所有虚拟机进程,不需要用户自己再使用jps来查询了。
20. JConsole”内存”页签相当于可视化的jstat命令,用于监控受收集器管理的虚拟机内存(java堆和永久代)的变化趋势。
21. 如果没有设置–XX:SurvivorRadio参数,那么Eden和Survivor空间的比例为默认值8:1。
22. 线程长时间停顿的主要原因是:等待外部资源(数据库连接,网络资源,设备资源等)、死循环、锁等待(活锁或者死锁)。
23. 可以补充一个演示繁忙线程和锁等待线程的DEMO,代码见(JConsoleThreadStudy.java)
24. 可以补充一个死锁的Demo(DeadLockTest.java). book:P94
25. 造成死锁的原因是Integer.valueOf()方法基于减少对象创建次数和节省内存的考虑,[-128,127]之间的数字会被缓存,当valueOf()方法在这个范围之内传入参数,将直接返回缓存中的对象。
26. VisualVM 是目前为止,随JDK发布的功能最强大的运行监视和故障处理程序,并且可以预见在未来一段时间都是官方主力发展的虚拟机故障处理程序。
27. VisualVM可以做到:
显示虚拟机进程及进程的配置和环境信息(jps,jinfo).
监视应用程序的CPU、GC、堆、方法区及线程信息(jstat,jstack)。
Dump及分析对转储快照(jmap,jhat)
方法级的程序运行性能分析,找出调用最多,运行时间最长的方法。
离线程序快照:收集程序的运行时配置,线程dump,内存dump等信息建立快照,可以将快照发送开发者处进行bug反馈。
其他plugins的无限的可能性。
28. BTrace是一个有趣的VisualVM插件,本身也是可以独立运行的程序,它的作用是在不停止目标运行程序的前提下,通过HotSpot虚拟机的HotSwap技术动态的加入原本不存在的调试代码。
引入一个Btrace的DEMO
29. 不同java虚拟机的DUMP规范不完全相同:
a) HotSpotVM:Sum官方的java虚拟机实现
b) OpenJDK:开源版本的虚拟机的实现
c) JRockit:BEA开发的,Weblogic使用的虚拟机
d) IBM J9 VM:AIX平台的java虚拟机
30. 线程DUMP:纯文本,各虚拟机发型版略微不同。
31. 堆DUMP:二进制格式,
a) HotSpotVM 与OpenJDK: HRPOF格式
b) JRockit:没有堆Dump,使用飞行记录
c) IBM J9VM :IBM ProtableHeap Dump (PHD) 格式
32. 当使用synchronized定义的同步块时,监视器是用来控制对象的锁的并发访问的结构。
33. Java 监视器怎么理解?
34. 在JVM里,monitor就是实现lock的方式。
35. 如果读者在工作中需要监控运行于JDK1.5的虚拟机之上的程序,在程序启动时请添加参数-Dcom.sun.management.jmxremote开启JMX管理功能,否则由于部分工作都是JMX的,因此他们将都会无法使用。
36.
更多推荐
所有评论(0)