暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

JVM处理笔记

胡钦振 2021-09-18
807
->常用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过高,系统运行缓慢。


文章转载自胡钦振,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论