虚拟机性能监控与故障处理工具
jdk的bin目录下,除了java、javac这两个命令行工具,还提供了很多其他工具。
命令行工具
1.jps(jvm process status tool)
显示所有虚拟机进程的运行状况。jps后面带不同的参数(-q、-m、-l、-v)显示进程id、传递给主类的参数、主类的全名、进程启动时的jvm参数。
2.jstat(jvm statistics monitoring tool)
纯文本显示虚拟机进程中类装载、内存、垃圾收集、jit编译等运行数据,更直观地可以用visual vm等可视化工具来看。如jstat -gc 49951,显示49951这个进程的gc信息。
Question:jstat -gc 49951这样显示的是整个jvm的内存分配信息,还是这一个进程的内存分配呢?进程间的内存分配是独立的吗?
启动一个应用,就是启动了一个虚拟机实例,即一个虚拟机进程。一个虚拟机进程,只能对应一个应用,一个进程管理多个线程。
运行java、javac、jps这些命令,就是启动了一个虚拟机进程。每个进程有自己独立的内存堆栈空间。比如,在intellij的每个application Server的配置中,可以设置虚拟机参数vmoptions,也就是对每个server分别设置了新生代、老生代大小之类。同样地,每次启动一个server,通过jps命令可以看到就多了一个进程。jps显示的是当前所有的虚拟机进程,而不是系统中启动的所有进程。
一个虚拟机进程中只有一个应用,也就是每个应用之间是独立的。目前没有一个虚拟机进程运行多个应用的说法,那样应该比较复杂吧~所以jstat这些命令的后面都要带上进程id。
启动一个本地项目后,查看进程,得到7667 org.apache.catalina.startup.Bootstrap,说明jvm启动了tomcat,tomcat容器负责应用的各种class的加载工作。
3.jinfo 实时查看和调整虚拟机参数
如jinfo -flag CMSInitiatingOccupancyFraction 83127,查看CMSInitiatingOccupancyFraction参数的配置。
4.jmap 生成堆转储快照(dump文件)
还可以查下finalize队列、java堆、永久代的详细信息等。如jmap -dump:format=b,file=/Users/zhangguixian/Downloads/intellij.log 83127生成一个进程的dump文件,然后用java的bin目录下jvisualvm工具分析dump文件。
5.jhat dump文件分析工具
目前一般都是用可视化的java visualVM等进行分析。
6.jstack java堆栈跟踪工具
显示当前时刻进程内所有线程的快照,通过线程快照可以定位线程出现长时间停顿的原因,如线程死锁、死循环、等待外部资源等。如jstack -F 12979,当正常输出请求不被响应时,强制输出堆栈信息。
7.HSDIS JIT生成代码反汇编
可视化工具
1.JConsole 基于jmx的可视化监控、管理工具
2.VisualVM 多合一故障处理工具
可以下载安装各种插件、生成dump文件、分析dump文件。