->常用Sun JDK监控和故障处理命令有jps jstat jmap jhat jstack jinfo
查看线上CPU过高,内存报警引起Full GC次数过多情况:
top命令查看Linux耗内存的进程,超过80%属于耗内存的进程了,再具体看线程;
top -Hp 300 查看进程里面线程运行情况:
jstack命令
-F:正常输出请求不被响应,强制输出线程堆栈
-l: 除堆栈外,显示锁的附加信息
命令:jstack -l 11494|more
Full thread dump Java HotSpot(TM) 64-Bit Server VM (25.131-b11 mixed mode):
"Attach Listener" #23306 daemon prio=9 os_prio=0 tid=0x00007fa6a0068800 nid=0x5674 waiting on condition [0x0000000000000000]
java.lang.Thread.State: RUNNABLE
Locked ownable synchronizers:
- None
"hystrix-paymentRemote-420" #23252 daemon prio=5 os_prio=0 tid=0x00007fa64408c000 nid=0x4706 waiting on condition [0x00007fa5bf3fa000]
java.lang.Thread.State: WAITING (parking)
at sun.misc.Unsafe.park(Native Method)
- parking to wait for <0x00000000899792d8> (a java.util.concurrent.SynchronousQueue$TransferStack)
at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)
at java.util.concurrent.SynchronousQueue$TransferStack.awaitFulfill(SynchronousQueue.java:458)
at java.util.concurrent.SynchronousQueue$TransferStack.transfer(SynchronousQueue.java:362)
at java.util.concurrent.SynchronousQueue.take(SynchronousQueue.java:924)
at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1067)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1127)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:748)
Locked ownable synchronizers:
- None
"hystrix-paymentRemote-419" #23251 daemon prio=5 os_prio=0 tid=0x00007fa64408a800 nid=0x4705 waiting on condition [0x00007fa5bf4fb000]
java.lang.Thread.State: WAITING (parking)
at sun.misc.Unsafe.park(Native Method)
- parking to wait for <0x00000000899792d8> (a java.util.concurrent.SynchronousQueue$TransferStack)
at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)
at java.util.concurrent.SynchronousQueue$TransferStack.awaitFulfill(SynchronousQueue.java:458)
at java.util.concurrent.SynchronousQueue$TransferStack.transfer(SynchronousQueue.java:362)
at java.util.concurrent.SynchronousQueue.take(SynchronousQueue.java:924)
at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1067)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1127)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:748)
Locked ownable synchronizers:
- None
jmp命令生成dump文件:
jmap -dump:live,format=b,file=dump.hprof 458
Dumping heap to tools/app/dump.hprof ...
Heap dump file created
jinfo实时查看虚拟机的运行参数
jinfo能看到所有未被显示的所有参数
jinfo -flags 458
JVM version is 25.131-b11
Non-default VM flags: -XX:CICompilerCount=3 -XX:InitialHeapSize=130023424 -XX:MaxHeapSize=2051014656 -XX:MaxNewSize=683671552 -XX:MinHeapDeltaBytes=524288 -XX:NewSize=42991616 -XX:OldSize=87031808 -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseFastUnorderedTimeStamps -XX:+UseParallelGC
Command line: -Denv=test -Dapollo.cluster=DEFAULT -Dspring.profiles.active=test
jps -v 查看指定参数(启动参数)
10883 jar -Denv=test -Dapollo.cluster=DEFAULT -Dspring.profiles.active=test
8518 portal-core-1.0.1.jar
18663 promactivityV2-0.0.1-SNAPSHOT.jar -Denv=test -Dapollo.cluster=DEFAULT -Dspring.profiles.active=test
9432 mvpoms.jar -Xms512M -Xmx512M -Duser.timezone=GMT+8
jstat -class PID
查看jvm已装载类情况
监视类装载、卸载数量、总空间以及耗费的时间
Loaded Bytes Unloaded Bytes Time
16126 29457.9 0 0.0 22.15
Loaded : 加载class的数量
Bytes : class字节大小
Unloaded : 未加载class的数量
Bytes : 未加载class的字节大小
Time : 加载时间
jstat -gc 27076
S0C S1C S0U S1U EC EU OC OU MC MU CCSC CCSU YGC YGCT FGC FGCT GCT
12288.0 9216.0 0.0 8839.3 481280.0 34665.9 134144.0 77165.9 90800.0 88793.1 10976.0 10555.2 43 0.901 3 0.517 1.418
导出一份内存快照,借助MAT工具来分析内存堆栈占用,和可能出现的内存泄露问题:
jmap -dump:live,format =b,file=dump.hprof 27076
小结
几种情况系统运行缓慢,线上大量报警,CPU过高和FullGC频繁导致的,或者某个功能无法使用:
这种情况重启系统,尽快恢复系统,提供服务。
导致系统不可用的问题:
某个位置读取大量数据,系统内存耗尽,导致FullGC次数过多,系统运行缓慢。
代码里有耗用CPU的地方,导致CPU过高,系统运行缓慢。




