深入理解java虚拟机的故障处理工具
前言
本文主要给大家介绍的是java虚拟机的故障处理工具,文中提到这些工具包括:
jps:虚拟机进程状况工具
jps的功能和unix/liunx中的ps命令是类似。只不过它是打印出正在运行的虚拟机进程,并显示虚拟机执行主类的名称以及这些进程的本地虚拟机唯一ID(LocalVirtualMachineIdentifier,LVMID,通常是系统进程ID)。
jps命令格式:
jps[options][hostId]
jps可以通过RMI协议查询开启了RMI服务的远程虚拟机进程状态,hostId为RMI注册表中注册的主机名称。
jps其他常用选项:
-q只输出LVMID,省略主类的名称;
-m输出虚拟机进程启动时候传递给主类main()函数的参数;
-l输出主类的全称,如果进程执行的是jar包,输出jar路径;
-v输出虚拟机进程启动时候JVM参数。
jps命令样例:
[root@localhost~]#jps-l 3914org.zhangyoubao.payservice.App 12180sun.tools.jps.Jps 6913org.zhangyoubao.userprofiler.App
jstat:虚拟机统计信息监视工具
jstat是用于监视虚拟机各种运行状态信息的工具。它可以显示本地或远程虚拟机进程中类load,内存gc.jit等运行参数。
jstat命令格式:
jstat[optionvmid[interval[s|ms][count]]]
interval和count代表查询间隔和次数。如果省略这两个参数,说明只查询一次。
jstat其他常用选项:
-class 监视类load/unload数量、总空间已经装载时间;
-compiler 输出JIT编译器编译过的方法、耗时等信息;
-printcompilation输出已经被JIT编译的方法;
-gc 监视java堆状况;
-gccapacity 监视内容与-gc基本相同,但输出关注java各个区域的最大/最小空间;
-gcutil 监视内容与-gc基本相同,但输出关注已使用空间占用百分百比;
-gccause 与-gcutil功能一样,额外输出导致上一次GC产生原因;
-gcnew 监视新生代GC状况;
-gcnewcapacity 监视新生代,输出同-gccapacity;
-gcold 监视老年代GC状况;
-gcoldcapacity 监视老年代,输出同-gccapacity;
-gcpermcapactiy 监视永久代(代码区),输出同-gccapacity;
jstat命令样例:
[root@localhost~]#jstat-gc6913 S0CS1CS0US1UECEUOCOUPCPUYGCYGCTFGCFGCTGCT 34048.034048.00.03217.8272640.0171092.7683264.0168910.746872.028031.237857380.644693.447384.091
jinfo:Java配置信息工具
jinfo的作用是实时的查看和调整虚拟机各项参数。
jinfo命令格式:
jinfo[option]pid
jinfo其他常用选项:
-flagname=value修改参数
-flagname参数参数
jinfo命令样例:
[root@localhost~]#jinfo6913 AttachingtoprocessID6913,pleasewait... Debuggerattachedsuccessfully. Servercompilerdetected. JVMversionis24.91-b01 JavaSystemProperties: ... VMFlags: -Xms1000m-Xmx1000m-Dconf=/usr/local/user_profiler/conf-Dserver.root=/usr/local/user_profiler-Dcom.sun.management.jmxremote.port=7003-Dcom.sun.management.jmxremote.ssl=false-Dcom.sun.management.jmxremote.authenticate=false-verbose:gc-XX:+PrintGCDetails-XX:+PrintGCDateStamps-XX:+UseConcMarkSweepGC
jmap:java内存映射工具
jmap命令可以用于生产堆存储快照(dump文件)。它还可以查下finalize队列(自我拯救队列)、java堆和代码区的详细信息。
jmap命令格式:
jmap[option]vmid
jmap其他常用选项:
-dump 生成java堆存储快照。格式:-dump:[live,]format=b,file=<filename>;
-finalizerinfo显示F-Queue中等待Finalizer现象执行finalize方法的对象;
-heap 显示java堆详细信息,如使用哪种回收器、参数配置、分代状况等待;
-histo 显示堆中对象统计信息,包括类、实例书、合计容量;
-permstat 以ClassLoader为统计入口显示永久代内存信息;
-F 当虚拟机进程堆-dump选项没有响应时候,可以使用这个选项强制生成dump快照。
jmap命令样例:
[root@localhost~]#jmap-histo6913|head-20 num#instances#bytesclassname ---------------------------------------------- 1:1864966113459432[C 2:20184649201192[B 3:159706538329560java.lang.String 4:11747715037056org.zhangyoubao.thriftdef.UserUsefulInfo 5:4710411072048[I 6:2686318596192java.util.HashMap$Entry 7:488127451760<constMethodKlass> 8:1006836443712com.mysql.jdbc.ConnectionPropertiesImpl$BooleanConnectionProperty 9:488126257856<methodKlass> 10:42305271640<constantPoolKlass> 11:1594915103712java.util.Hashtable$Entry 12:1202264809040org.zhangyoubao.common.cache.adv.Node 13:1270274064864java.util.concurrent.ConcurrentHashMap$HashEntry 14:2304333686928java.lang.Integer 15:37653049824<constantPoolCacheKlass> 16:209173012048com.mysql.jdbc.Field 17:42302943840<instanceKlassKlass>
其中[C=char[],[B=byte[],[S=short[],[I=int[],[[I=int[][]。
jhat:虚拟机堆转存快照分析工具
jhat命令用于与jmap搭配使用,用来分析jmap生成的dump文件。jhat内置了一个微型的HTTP/HTML服务器,生成的dump文件的分析结果后,可以在浏览器查看。
jhat命令格式:
jmapfilename
jhat命令样例:
[root@localhost~]#jhathtml_intercept_server.dump Readingfromhtml_intercept_server.dump... DumpfilecreatedWedNov2313:05:33CST2016 Snapshotread,resolving... Resolving203681objects... Chasingreferences,expect40dots........................................ Eliminatingduplicatereferences........................................ Snapshotresolved. StartedHTTPserveronport7000 Serverisready.
jstack:java线程堆栈跟踪工具
jstack用于生成虚拟机当前时刻的线程快照。线程快照就是当前虚拟机每一条线程正在执行的方法堆栈计划,生成线程快照的主要目的是定位线程长时间停顿的原因。在线程停顿的时候,通过jstack来查看没有响应的线程在后台做些什么事情,或者等待着什么资源。
jstack命令格式:
jstack[option]vmid
jstack其他选项:
-F当正常输出的请求不被响应的时候,强制输出线程堆栈;
-l除了显示堆栈外,显示关于锁的附加信息;
-m如果调用本地方法,可以显示C/C++的堆栈。
jstack命令样例:
[root@localhost~]#jstack29577|head-20 2016-11-2312:58:23 FullthreaddumpOpenJDKServerVM(24.91-b01mixedmode): "pool-1-thread-7261"prio=10tid=0x0893a400nid=0x6b0dwaitingoncondition[0x652ad000] java.lang.Thread.State:TIMED_WAITING(parking) atsun.misc.Unsafe.park(NativeMethod) -parkingtowaitfor<0x75b5b400>(ajava.util.concurrent.SynchronousQueue$TransferStack) atjava.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:226) atjava.util.concurrent.SynchronousQueue$TransferStack.awaitFulfill(SynchronousQueue.java:460) atjava.util.concurrent.SynchronousQueue$TransferStack.transfer(SynchronousQueue.java:359) atjava.util.concurrent.SynchronousQueue.poll(SynchronousQueue.java:942) atjava.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1068) atjava.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1130) atjava.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) atjava.lang.Thread.run(Thread.java:745) "service_hot_lscs-0"daemonprio=10tid=0x6982dc00nid=0x6aebwaitingoncondition[0x64ce1000] java.lang.Thread.State:TIMED_WAITING(sleeping) atjava.lang.Thread.sleep(NativeMethod) atorg.zhangyoubao.video.client.runner.SimpleVideoRunner.doWork(SimpleVideoRunner.java:150)
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。