首页 > 代码库 > 深入理解_JVM内存管理JDK监控工具与故障处理工具07

深入理解_JVM内存管理JDK监控工具与故障处理工具07

1、jps:
     JVM process Status Tool,显示系统所有的HotSpot虚拟机进程以及进程的本地虚拟机的唯一ID(LVMID,Local Virtual Machine Identifier)。
     对于本地虚拟机进程来说,LVMID与操作系统的进程ID(PID,Process Identifier)是一致的。如果启动了多个虚拟机进程,就需要显示主类的功能才能区分了。
jps命令格式:
          jps [option] [hostid]
jps主要选项:
     -v :输出虚拟机进程启动时JVM参数。
     -q :只输出LVMID,省略主类的名称;
     -m :输出虚拟机进程启动时传递给主类main()函数的参数;
     -l :输出主类的全名,如果进程执行的是jar包,输出jar包路径;
 
2、jstat:
     用于监视虚拟机各种运行状态信息的命令行工具。
jstat命令格式:
     jstat [option vimd] [interval [s|ms] [count]]
     VIMD与LVMID的区别:
     <1>如果是本地虚拟主机,VIMD与LVMID是一致的。
     <2>如果是远程虚拟机进程,
          VIMD的格式:[protocol:][//]lvmid[@hostname[:port]/servername]
     interval:代表查询间隔;
     count:次数。
     如果省略上述2个参数,则只查询一次。
jstat主要选项:
     jstat -class pid:监视class装载、卸载的数量,总空间及类装载所耗费的时间。 
jstat -gc pid:监视java堆状况,包括1个Eden区,2个Survivor区,老生代、持久代等的容量、已用空间。显示gc的信息,查看gc的次数,及时间。其中最后五项,分别是young gc的次数,young gc的时间,full gc的次数,full gc的时间,gc的总时间。
jstat -gccapacity:监视内容与-gc基本一样,但输出主要关注java堆各区域使用到的最大和最小空间。如:PGCMN显示的是最小perm的内存使用量,PGCMX显示的是perm的内存最大使用量,PGC是当前新生成的perm内存占用量,PC是当前perm内存占用量。其他的可以根据这个类推, OC是old内存的占用量。
jstat -gcutil pid:监视内容与-gc基本一样,但主要输出已使用空间占总空间的百分比。
jstat -gccause pid:与gcutil一样,但是会额外输出导致上一次GC产生的原因。
jstat -gcnew pid:监控新生代GC的状况。
jstat -gcnewcapacity pid:监控内存与-gcnew基本相同,输出主要关注到使用的最大和最小空间。
jstat -gcold pid:监控老生代GC的状况。
jstat -gcoldcapacity pid:监控内存与-gcold基本相同,输出主要关注到使用的最大和最小空间。
jstat -gcpermcapacity pid: 输出永久代使用到的最大和最小空间。
jstat -compiler pid:显示VM实时编译的数量等信息。 
jstat -printcompilation pid:输出已经被JIT编译的方法。 
 
3、jinfo:
     实时查看和调整虚拟机的各项参数。
jinfo命令格式:
     jinfo [option] pid
jinfo主要选项:
     jinfo -flag <name> pid : name是JVM参数的名字。
     例如:
          执行:C:\Users\yyang7>jinfo -flag CMSInitiatingOccupancyFraction 8072
          结果:-XX:CMSInitiatingOccupancyFraction=-1
 
4、jmap:
功能:
     <1> 用于生成堆转储快照(heapdump)
     如果不适用该命令,还可以尝试试用:-XX:+HeapDumpOnOutMemoryError参数,可以让虚拟机在OOM时自动生成dump文件。(疲劳测试时候常开启该参数)。通过在VM参数后加-XX:+HeapDumpOnOutOfMemoryError -
XX:HeapDumpPath=/home/admin/logs/java.hprof ,在内存溢的时候会dump内存快照及指定内存快照的存储文件.也可以通过命令行dump命令执行时的内存快照.
     <2> 查询finalize执行队列,java堆和永久代的详细信息。
jmap命令格式:
     jmap [option] vmid
     
jmap主要选项:
     -dump:生成java堆转储快照。格式为:-dump:[live,]format=b,file=<filename> PID,其中live子参数说明是否只dump出存活的对象。
     -finalizeinfo:显示在F-Queue中等待Finalize线程执行finalize方法的对象,只在linux和Solaris平台下有效。
     -heap:显示java堆的详细信息,如使用哪种回收器,参数配置,分代状况等,只在linux和Solaris平台有效。
     -histo:显示堆中对象统计信息,包括类、实例数量和合计容量。
     -permstat:以ClassLoader为统计口径显示永久代内存状态,只在linux和Solaris平台有效。
     -F:当虚拟机进程堆-dump选项没有响应时,可使用这个选项强制生成dump快照,只在linux和Solaris平台有效。
 
5、jhat:
     虚拟机堆转储快照分析工具,一般不用此工具。
 
6、jstack:
     用于生成虚拟机当前时刻的线程快照,(Threaddump或javacode文件)。
     线程快照就是当前虚拟机内每一条线程正在执行的方法堆栈的集合。
主要目的:
     定位线程出现长时间停顿的原因,如线程死锁、死循环、请求外部资源导致的长时间等待等。
jstack命令格式:
     jstack [option] vmid
jstack主要选项:
     -F:当正常输出的请求不被响应时,强制输出线程堆栈。
     -l:除堆栈外,显示关于锁的附加信息。
     -m:如果调用到本地方法的话,可以显示C/C++信息。 

深入理解_JVM内存管理JDK监控工具与故障处理工具07