前面几篇讲了关于JVM的理论知识,今天介绍几个JDK的命令行工具,来快速定位线上问题。java
用法:jps命令格式:jsp [options] [hostid]
jps执行样例:apache
[root@izbp13zpfq979odk0kub10z ~]# jps -l
3409 tale-least.jar
23702 org.apache.catalina.startup.Bootstrap
26779 sun.tools.jps.Jps
复制代码
jps工具主要选项:bash
jstat命令格式:jstat [option vmid [ interval[s|ms] [count] ] ]
jstat执行样例:服务器
[root@izbp13zpfq979odk0kub10z ~]# jstat -gc 3409 5s 2
S0C S1C S0U S1U EC EU OC OU MC MU CCSC CCSU YGC YGCT FGC FGCT GCT
4352.0 4352.0 0.0 208.6 34944.0 26126.4 87424.0 28452.7 28160.0 26891.3 3072.0 2755.0 3583 9.813 1 0.035 9.848
4352.0 4352.0 0.0 208.6 34944.0 26126.4 87424.0 28452.7 28160.0 26891.3 3072.0 2755.0 3583 9.813 1 0.035 9.848
复制代码
执行样例中3409是进程ID,5s是每隔五秒查询一次,2是一共查询两次。eclipse
ps -p pid -o etime
查看下进程的运行时间:[root@izbp13zpfq979odk0kub10z ~]# ps -p 3409 -o etime
ELAPSED
104-04:30:20
复制代码
哈哈,104天才执行一次YGC与FGC才这么点。若是YGC过于频繁说明eden不够了,能够考虑加机器。正常来讲FGC应该占整个GC(YGC+FGC)的1%到5%才正常,若是FGC过于频繁,能够考虑增大MaxPermSize的值。
jstat主要工具选项:jsp
用来实时地查看和调整虚拟机各项参数
jinfo命令格式:jinfo [ option ] pid
jinfo执行样例:工具
[root@izbp13zpfq979odk0kub10z ~]# jinfo -flag MaxHeapSize 3409
-XX:MaxHeapSize=134217728
复制代码
jinfo工具主要选项:ui
命令用于生成堆转储快照(通常称为heapdump或dump文件)
jmap命令格式:jmap [option] vmid
jmap执行样例:spa
[root@izbp13zpfq979odk0kub10z ~]# jmap -dump:live,format=b,file=blog.log 3409
Dumping heap to /root/blog.log ...
Heap dump file created
复制代码
jmap主要工具选项:命令行
jhat(JVM Heap Analysis Tool)命令与jmap搭配使用,来分析jmap生成的堆转储快照。通常不会直接使用jhat命令来分析dump文件,主要缘由有二:一是通常不会在部署应用程序的服务器上直接分析dump文件;另一个缘由是jhat的分析功能相对来讲比较简陋。
jhat执行样例:
[root@izbp13zpfq979odk0kub10z ~]# jhat blog.log
Reading from blog.log...
Dump file created Tue Sep 11 22:52:53 CST 2018
Snapshot read, resolving...
Resolving 281153 objects...
Chasing references, expect 56 dots........................................................
Eliminating duplicate references........................................................
Snapshot resolved.
复制代码
jstack(Stack Trace for Java)命令用于生产虚拟机当前时刻的线程快照(通常称为threaddump或者javacore文件)。线程快照就是当虚拟机内每一条线程正在执行的方法堆栈集合,生产线程快照的主要目的是定位线程出现长时间停顿的缘由,如线程间死锁、死循环、请求外部资源致使长时间等待等都是致使线程长时间停顿的常见缘由。线程出现停顿的时候经过jstack来查看各个线程的调用堆栈,就能够知道没有响应的线程到底在后台作些什么事情,或者等待着什么资源。
jstack命令格式:jstack [option] vmid
jstack执行样例:
[root@izbp13zpfq979odk0kub10z ~]# jstack -l 3409
2018-09-11 22:57:24
Full thread dump Java HotSpot(TM) 64-Bit Server VM (25.152-b16 mixed mode):
"blade-pool-252" #252 prio=5 os_prio=0 tid=0x00007fcbf00bb000 nid=0x4845 waiting on condition [0x00007fcbd2fee000]
java.lang.Thread.State: TIMED_WAITING (parking)
at sun.misc.Unsafe.park(Native Method)
- parking to wait for <0x00000000fb242608> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
at java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:215)
at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(AbstractQueuedSynchronizer.java:2078)
at org.eclipse.jetty.util.BlockingArrayQueue.poll(BlockingArrayQueue.java:392)
at org.eclipse.jetty.util.thread.QueuedThreadPool.idleJobPoll(QueuedThreadPool.java:564)
at org.eclipse.jetty.util.thread.QueuedThreadPool.access$800(QueuedThreadPool.java:49)
at org.eclipse.jetty.util.thread.QueuedThreadPool$2.run(QueuedThreadPool.java:627)
at java.lang.Thread.run(Thread.java:748)
Locked ownable synchronizers:
- None
复制代码
jstack主要工具选项:
若是读完以为有收获的话,欢迎点赞、关注、加公众号【Java在线】,查阅更多精彩历史!!!