欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java應(yīng)用CPU使用率過(guò)高排查方式

 更新時(shí)間:2023年07月27日 10:22:12   作者:煙雨樓臺(tái)笑江湖  
這篇文章主要介紹了Java應(yīng)用CPU使用率過(guò)高排查方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

Java應(yīng)用CPU使用率過(guò)高排查

1.使用top命令查看使用CPU過(guò)高的進(jìn)程

top

top - 14:16:06 up 27 min, ?3 users, ?load average: 0.00, 0.01, 0.02
Tasks: ?88 total, ? 2 running, ?86 sleeping, ? 0 stopped, ? 0 zombie
%Cpu(s): ?0.0 us, ?0.0 sy, ?0.0 ni,100.0 id, ?0.0 wa, ?0.0 hi, ?0.0 si, ?0.0 st
KiB Mem : ? 999692 total, ? 454684 free, ? 206396 used, ? 338612 buff/cache
KiB Swap: ? 204796 total, ? 204796 free, ? ? ? ?0 used. ? 614532 avail Mem?
? ?PID USER ? ? ?PR ?NI ? ?VIRT ? ?RES ? ?SHR S %CPU %MEM ? ? TIME+ COMMAND ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? 1113 root ? ? ?20 ? 0 2583028 131816 ?15412 S ?0.3 13.2 ? 0:01.65 java ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
? ? ?1 root ? ? ?20 ? 0 ?128164 ? 6832 ? 4060 S ?0.0 ?0.7 ? 0:00.66 systemd

2.使用 top -H -p [pid]查看使用CPU過(guò)高的線程

top -H -p 1113

top - 14:17:34 up 28 min, ?3 users, ?load average: 0.00, 0.01, 0.02
Threads: ?19 total, ? 0 running, ?19 sleeping, ? 0 stopped, ? 0 zombie
%Cpu(s): ?0.0 us, ?0.3 sy, ?0.0 ni, 99.7 id, ?0.0 wa, ?0.0 hi, ?0.0 si, ?0.0 st
KiB Mem : ? 999692 total, ? 454800 free, ? 206272 used, ? 338620 buff/cache
KiB Swap: ? 204796 total, ? 204796 free, ? ? ? ?0 used. ? 614652 avail Mem?
? ?PID USER ? ? ?PR ?NI ? ?VIRT ? ?RES ? ?SHR S %CPU %MEM ? ? TIME+ COMMAND ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? 1114 root ? ? ?20 ? 0 2583028 131816 ?15412 S ?0.0 13.2 ? 0:00.74 java ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
? 1115 root ? ? ?20 ? 0 2583028 131816 ?15412 S ?0.0 13.2 ? 0:00.00 java ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
? 1116 root ? ? ?20 ? 0 2583028 131816 ?15412 S ?0.0 13.2 ? 0:00.02 java ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
? 1117 root ? ? ?20 ? 0 2583028 131816 ?15412 S ?0.0 13.2 ? 0:00.00 java ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
? 1118 root ? ? ?20 ? 0 2583028 131816 ?15412 S ?0.0 13.2 ? 0:00.00 java

3.使用jstack -l [pid]查看jvm當(dāng)前的線程信息

jstack -l 1113

[root@node01 ~]# jstack -l 1113
2023-01-06 14:20:52
Full thread dump Java HotSpot(TM) 64-Bit Server VM (25.211-b12 mixed mode):
"Attach Listener" #17 daemon prio=9 os_prio=0 tid=0x00007fb904001000 nid=0x4b2 waiting on condition [0x0000000000000000]
? ?java.lang.Thread.State: RUNNABLE
? ?Locked ownable synchronizers:
? ? ? ? - None
"DestroyJavaVM" #16 prio=5 os_prio=0 tid=0x00007fb93400c800 nid=0x45a waiting on condition [0x0000000000000000]
? ?java.lang.Thread.State: RUNNABLE
? ?Locked ownable synchronizers:
? ? ? ? - None
"FileWatchService" #15 prio=5 os_prio=0 tid=0x00007fb934788800 nid=0x46a waiting on condition [0x00007fb90d3d2000]
? ?java.lang.Thread.State: TIMED_WAITING (parking)
? ? ? ? at sun.misc.Unsafe.park(Native Method)
? ? ? ? - parking to wait for ?<0x00000000e392af58> (a org.apache.rocketmq.common.CountDownLatch2$Sync)
? ? ? ? at java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:215)
? ? ? ? at java.util.concurrent.locks.AbstractQueuedSynchronizer.doAcquireSharedNanos(AbstractQueuedSynchronizer.java:1037)
? ? ? ? at java.util.concurrent.locks.AbstractQueuedSynchronizer.tryAcquireSharedNanos(AbstractQueuedSynchronizer.java:1328)
? ? ? ? at org.apache.rocketmq.common.CountDownLatch2.await(CountDownLatch2.java:114)
? ? ? ? at org.apache.rocketmq.common.ServiceThread.waitForRunning(ServiceThread.java:139)
? ? ? ? at org.apache.rocketmq.srvutil.FileWatchService.run(FileWatchService.java:70)
? ? ? ? at java.lang.Thread.run(Thread.java:748)
? ?Locked ownable synchronizers:
? ? ? ? - None
"NettyEventExecutor" #10 prio=5 os_prio=0 tid=0x00007fb934787800 nid=0x469 waiting on condition [0x00007fb90d4d3000]
? ?java.lang.Thread.State: TIMED_WAITING (parking)
? ? ? ? at sun.misc.Unsafe.park(Native Method)
? ? ? ? - parking to wait for ?<0x00000000e13b8328> (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 java.util.concurrent.LinkedBlockingQueue.poll(LinkedBlockingQueue.java:467)
? ? ? ? at org.apache.rocketmq.remoting.netty.NettyRemotingAbstract$NettyEventExecutor.run(NettyRemotingAbstract.java:589)
? ? ? ? at java.lang.Thread.run(Thread.java:748)
? ?Locked ownable synchronizers:
? ? ? ? - None
"NettyNIOBoss_1" #14 prio=5 os_prio=0 tid=0x00007fb934787000 nid=0x468 runnable [0x00007fb90d5d4000]
? ?java.lang.Thread.State: RUNNABLE
? ? ? ? at sun.nio.ch.EPollArrayWrapper.epollWait(Native Method)
? ? ? ? at sun.nio.ch.EPollArrayWrapper.poll(EPollArrayWrapper.java:269)
? ? ? ? at sun.nio.ch.EPollSelectorImpl.doSelect(EPollSelectorImpl.java:93)
? ? ? ? at sun.nio.ch.SelectorImpl.lockAndDoSelect(SelectorImpl.java:86)
? ? ? ? - locked <0x00000000e1c8e928> (a io.netty.channel.nio.SelectedSelectionKeySet)
? ? ? ? - locked <0x00000000e1c83868> (a java.util.Collections$UnmodifiableSet)
? ? ? ? - locked <0x00000000e1c82430> (a sun.nio.ch.EPollSelectorImpl)
? ? ? ? at sun.nio.ch.SelectorImpl.select(SelectorImpl.java:97)
? ? ? ? at sun.nio.ch.SelectorImpl.select(SelectorImpl.java:101)
? ? ? ? at io.netty.channel.nio.SelectedSelectionKeySetSelector.select(SelectedSelectionKeySetSelector.java:68)
? ? ? ? at io.netty.channel.nio.NioEventLoop.select(NioEventLoop.java:810)
? ? ? ? at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:457)
? ? ? ? at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:989)
? ? ? ? at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
? ? ? ? at java.lang.Thread.run(Thread.java:748)
? ?Locked ownable synchronizers:
? ? ? ? - None
"NSScheduledThread1" #12 prio=5 os_prio=0 tid=0x00007fb93473c000 nid=0x467 waiting on condition [0x00007fb90d6d5000]
? ?java.lang.Thread.State: TIMED_WAITING (parking)
? ? ? ? at sun.misc.Unsafe.park(Native Method)
? ? ? ? - parking to wait for ?<0x00000000e12f8ad0> (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 java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:1093)
? ? ? ? at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:809)
? ? ? ? at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1074)
? ? ? ? at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1134)
? ? ? ? at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
? ? ? ? at java.lang.Thread.run(Thread.java:748)
? ?Locked ownable synchronizers:
? ? ? ? - None
"ServerHouseKeepingService" #11 daemon prio=5 os_prio=0 tid=0x00007fb93457c800 nid=0x466 in Object.wait() [0x00007fb920a25000]
? ?java.lang.Thread.State: TIMED_WAITING (on object monitor)
? ? ? ? at java.lang.Object.wait(Native Method)
? ? ? ? at java.util.TimerThread.mainLoop(Timer.java:552)
? ? ? ? - locked <0x00000000e13b8b70> (a java.util.TaskQueue)
? ? ? ? at java.util.TimerThread.run(Timer.java:505)
? ?Locked ownable synchronizers:
? ? ? ? - None
"AsyncAppender-Worker-RocketmqNamesrvAppender" #9 daemon prio=5 os_prio=0 tid=0x00007fb934549000 nid=0x465 waiting on condition [0x00007fb920b26000]
? ?java.lang.Thread.State: WAITING (parking)
? ? ? ? at sun.misc.Unsafe.park(Native Method)
? ? ? ? - parking to wait for ?<0x00000000e128ee68> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
? ? ? ? at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)
? ? ? ? at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2039)
? ? ? ? at java.util.concurrent.ArrayBlockingQueue.take(ArrayBlockingQueue.java:403)
? ? ? ? at ch.qos.logback.core.AsyncAppenderBase$Worker.run(AsyncAppenderBase.java:289)
? ?Locked ownable synchronizers:
? ? ? ? - None
"Service Thread" #8 daemon prio=9 os_prio=0 tid=0x00007fb9340e3800 nid=0x463 runnable [0x0000000000000000]
? ?java.lang.Thread.State: RUNNABLE
? ?Locked ownable synchronizers:
? ? ? ? - None
"C1 CompilerThread1" #7 daemon prio=9 os_prio=0 tid=0x00007fb9340e0800 nid=0x462 waiting on condition [0x0000000000000000]
? ?java.lang.Thread.State: RUNNABLE
? ?Locked ownable synchronizers:
? ? ? ? - None
"C2 CompilerThread0" #6 daemon prio=9 os_prio=0 tid=0x00007fb9340de800 nid=0x461 waiting on condition [0x0000000000000000]
? ?java.lang.Thread.State: RUNNABLE
? ?Locked ownable synchronizers:
? ? ? ? - None
"Signal Dispatcher" #5 daemon prio=9 os_prio=0 tid=0x00007fb9340dc000 nid=0x460 runnable [0x0000000000000000]
? ?java.lang.Thread.State: RUNNABLE
? ?Locked ownable synchronizers:
? ? ? ? - None
"Surrogate Locker Thread (Concurrent GC)" #4 daemon prio=9 os_prio=0 tid=0x00007fb9340db000 nid=0x45f waiting on condition [0x0000000000000000]
? ?java.lang.Thread.State: RUNNABLE
? ?Locked ownable synchronizers:
? ? ? ? - None
"Finalizer" #3 daemon prio=8 os_prio=0 tid=0x00007fb9340a8000 nid=0x45e in Object.wait() [0x00007fb9218f5000]
? ?java.lang.Thread.State: WAITING (on object monitor)
? ? ? ? at java.lang.Object.wait(Native Method)
? ? ? ? - waiting on <0x00000000e0008ed0> (a java.lang.ref.ReferenceQueue$Lock)
? ? ? ? at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:144)
? ? ? ? - locked <0x00000000e0008ed0> (a java.lang.ref.ReferenceQueue$Lock)
? ? ? ? at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:165)
? ? ? ? at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:216)
? ?Locked ownable synchronizers:
? ? ? ? - None
"Reference Handler" #2 daemon prio=10 os_prio=0 tid=0x00007fb9340a5000 nid=0x45d in Object.wait() [0x00007fb9219f6000]
? ?java.lang.Thread.State: WAITING (on object monitor)
? ? ? ? at java.lang.Object.wait(Native Method)
? ? ? ? - waiting on <0x00000000e0006bf8> (a java.lang.ref.Reference$Lock)
? ? ? ? at java.lang.Object.wait(Object.java:502)
? ? ? ? at java.lang.ref.Reference.tryHandlePending(Reference.java:191)
? ? ? ? - locked <0x00000000e0006bf8> (a java.lang.ref.Reference$Lock)
? ? ? ? at java.lang.ref.Reference$ReferenceHandler.run(Reference.java:153)
? ?Locked ownable synchronizers:
? ? ? ? - None
"VM Thread" os_prio=0 tid=0x00007fb93409b800 nid=0x45c runnable?
"Concurrent Mark-Sweep GC Thread" os_prio=0 tid=0x00007fb93402c000 nid=0x45b runnable?
"VM Periodic Task Thread" os_prio=0 tid=0x00007fb9340e6800 nid=0x464 waiting on condition?
JNI global references: 318

這里重點(diǎn)住 nid 的值,可以看到是16進(jìn)制的,把之前使用 top -H -p 1113獲取到的線程id轉(zhuǎn)成16進(jìn)制(比如上面的1114對(duì)應(yīng)16進(jìn)制45a),用這個(gè)值過(guò)濾 jstack -l 1113 | grep 45a

[root@node01 ~]# jstack -l 1113 | grep 45a
"Reference Handler" #2 daemon prio=10 os_prio=0 tid=0x00007fb9340a5000 nid=0x45a in Object.wait() [0x00007fb9219f6000]

這樣就能定位到有問(wèn)題的線程了。

這里僅記錄解決問(wèn)題的過(guò)程,沒(méi)有找到合適的例子,截圖的命令結(jié)果可能不能體現(xiàn)出實(shí)際問(wèn)題,后續(xù)遇到了,再更新。

如果發(fā)現(xiàn)CPU使用率飆高是fullgc導(dǎo)致,那可能需要看一下內(nèi)存這塊問(wèn)題,比如內(nèi)存不夠用導(dǎo)致頻繁fullgc。

cpu使用率飚高實(shí)戰(zhàn)分析(java應(yīng)用)

有關(guān)于java應(yīng)用CPU使用率超高的問(wèn)題,已經(jīng)有很多博客有過(guò)分析了。

無(wú)外乎就是,某個(gè)線程執(zhí)行執(zhí)行耗CPU的動(dòng)作了。

我們主要的工作就是通過(guò)Linux命令和java相關(guān)命令找到具體的線程,并分析線程執(zhí)行代碼。

本文比較簡(jiǎn)單,就當(dāng)是做一個(gè)記錄。

1.準(zhǔn)備工作

1.1 安裝并啟動(dòng)docker tomcat

# 1.拉取tomcat鏡像
hxw@hxwdeMacBook-Pro ~ % docker pull tomcat
# 2.完成后,啟動(dòng)一個(gè)tomcat容器
# tomcat默認(rèn)啟動(dòng)端口為8080,將該端口映射到Mac的8088上
hxw@hxwdeMacBook-Pro ~ % docker run -p 8088:8080 -d tomcat
# 3.啟動(dòng)完成后,通過(guò)docker ps查看
hxw@hxwdeMacBook-Pro ~ % docker ps
CONTAINER ID   IMAGE           COMMAND                  CREATED        STATUS          PORTS                    NAMES
606ca0c7f783   tomcat:8.0.15   "catalina.sh run"        4 hours ago    Up 42 minutes   0.0.0.0:8088->8080/tcp   gracious_greider
# 4.驗(yàn)證tomcat啟動(dòng)
# 通過(guò)瀏覽器訪問(wèn) localhost:8088,出現(xiàn)tomcat即可

1.2 準(zhǔn)備war包,并拷貝到docker tomcat中

war包中有一個(gè)方法會(huì)引起CPU飆高,文章最后再做說(shuō)明
# 1.準(zhǔn)備war包,名稱為SpringTest.war
# 2.拷貝到docker中
hxw@hxwdeMacBook-Pro ~ % docker cp SpringTest.war 606ca0c7f783:/usr/local/tomcat/webapps
# 3.重啟tomcat
hxw@hxwdeMacBook-Pro ~ % docker restart 606ca0c7f783

2.分析CPU飆高問(wèn)題

需要先調(diào)用tomcat中SpringTest.war相關(guān)方法,這里先不說(shuō)明,文章最終再說(shuō)

需要注意的是:以下操作都是在tomcat所在容器中進(jìn)行的

2.1 進(jìn)入tomcat容器,安裝所需工具

# 1.通過(guò)docker exec命令進(jìn)入
hxw@hxwdeMacBook-Pro ~ % docker exec -it 606ca0c7f783 /bin/bash
root@606ca0c7f783:/usr/local/tomcat#?
# 2.安裝JDK,筆者這里默認(rèn)沒(méi)有jdk
root@606ca0c7f783:/usr/local/tomcat# apt-get update
root@606ca0c7f783:/usr/local/tomcat# apt-get install default-jdk
root@606ca0c7f783:/usr/local/tomcat# apt-get install less

主要使用的工具就是top和jdk(jstack)

less命令筆者所在tomcat也沒(méi)有,也需要安裝的(讀者如果還需要其他命令,可自行安裝,按照debain的方式來(lái)安裝即可)

2.2 top分析進(jìn)程CPU使用率

root@606ca0c7f783:/usr/local/tomcat# top?
top - 07:42:09 up ?8:50, ?0 users, ?load average: 1.06, 0.41, 0.25
Tasks: ? 3 total, ? 0 running, ? 2 sleeping, ? 0 stopped, ? 0 zombie
%Cpu(s): 22.0 us, 49.9 sy, ?0.0 ni, 28.1 id, ?0.0 wa, ?0.0 hi, ?0.0 si, ?0.0 st
KiB Mem: ? 2036420 total, ?1895796 used, ? 140624 free, ? 140304 buffers
KiB Swap: ?1048572 total, ? ?64248 used, ? 984324 free. ? 817248 cached Mem
? PID USER ? ? ?PR ?NI ? ?VIRT ? ?RES ? ?SHR S ?%CPU %MEM ? ? TIME+ COMMAND ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? 1 root ? ? ?20 ? 0 3318896 400936 ?13704 S 101.3 19.7 ? 0:52.43 java ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
? ?58 root ? ? ?20 ? 0 ?169276 ?10464 ? 3052 S ? 0.0 ?0.5 ? 0:00.22 bash ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
?3186 root ? ? ? 0 ? 0 ?170660 ? 9408 ? 4084 0 ? 0.0 ?0.5 ? 0:00.00 top

很容易就看到,PID=1的進(jìn)程占用了101%的CPU,就是這個(gè)進(jìn)程使CPU飆高的

2.3 查看使當(dāng)前進(jìn)程飆高的線程信息

# 這里的1,就是上面占用CPU的進(jìn)程PID
root@606ca0c7f783:/usr/local/tomcat# top -H -p 1
? PID USER ? ? ?PR ?NI ? ?VIRT ? ?RES ? ?SHR S %CPU %MEM ? ? TIME+ COMMAND ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
?3388 root ? ? ?20 ? 0 3319700 392824 ?13732 R 99.8 19.3 ? 1:29.68 java ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? 1 root ? ? ?20 ? 0 3319700 392824 ?13732 S ?0.0 19.3 ? 0:00.05 java ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ?27 root ? ? ?20 ? 0 3319700 392824 ?13732 S ?0.0 19.3 ? 0:00.00 java ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ?28 root ? ? ?20 ? 0 3319700 392824 ?13732 S ?0.0 19.3 ? 0:02.65 java ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ?29 root ? ? ?20 ? 0 3319700 392824 ?13732 S ?0.0 19.3 ? 0:00.36 java ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ?30 root ? ? ?20 ? 0 3319700 392824 ?13732 S ?0.0 19.3 ? 0:00.37 java?
PID=3388的這個(gè)線程,占用了99.8%的CPU,那么我們直接分析這個(gè)線程就可以了

2.4 jstack命令查看進(jìn)程棧信息

# 1.將進(jìn)程號(hào)=1的進(jìn)程棧信息導(dǎo)出到2.txt中
root@606ca0c7f783:/usr/local/tomcat# jstack 1 > 2.txt
# 2.將線程號(hào)轉(zhuǎn)換為16進(jìn)制(3388就是2.3中查出來(lái)的線程號(hào))
root@606ca0c7f783:/usr/local/tomcat# ?printf "%x\n" 3388
d3c
# 3.查詢d3c的線程信息
root@606ca0c7f783:/usr/local/tomcat# grep d3c 2.txt?
"http-nio-8080-exec-7" daemon prio=10 tid=0x00000040b4005000 nid=0xd3c runnable [0x00000041100b6000]
? ?java.lang.Thread.State: RUNNABLE
? ? ? ? at java.io.FileOutputStream.writeBytes(Native Method)
? ? ? ? at java.io.FileOutputStream.write(FileOutputStream.java:345)
? ? ? ? at java.io.BufferedOutputStream.flushBuffer(BufferedOutputStream.java:82)
? ? ? ? at java.io.BufferedOutputStream.flush(BufferedOutputStream.java:140)
? ? ? ? - locked <0x00000000d6d2ff58> (a java.io.BufferedOutputStream)
? ? ? ? at java.io.PrintStream.write(PrintStream.java:482)
? ? ? ? - locked <0x00000000d6d2ff38> (a java.io.PrintStream)
? ? ? ? at sun.nio.cs.StreamEncoder.writeBytes(StreamEncoder.java:221)
? ? ? ? at sun.nio.cs.StreamEncoder.implFlushBuffer(StreamEncoder.java:291)
? ? ? ? at sun.nio.cs.StreamEncoder.flushBuffer(StreamEncoder.java:104)
? ? ? ? - locked <0x00000000d6d30088> (a java.io.OutputStreamWriter)
? ? ? ? at java.io.OutputStreamWriter.flushBuffer(OutputStreamWriter.java:185)
? ? ? ? at java.io.PrintStream.newLine(PrintStream.java:546)
? ? ? ? - eliminated <0x00000000d6d2ff38> (a java.io.PrintStream)
? ? ? ? at java.io.PrintStream.println(PrintStream.java:737)
? ? ? ? - locked <0x00000000d6d2ff38> (a java.io.PrintStream)
? ? ? ? at org.apache.tomcat.util.log.SystemLogHandler.println(SystemLogHandler.java:237)
? ? ? ? # 在這里可以看到具體的代碼塊
? ? ? ? at com.example.controller.JvmTest.incre(JvmTest.java:21)

最終分析到是由于JvmTest.incre()方法導(dǎo)致的CPU飆高

2.5 通過(guò)代碼驗(yàn)證分析正確性

既然分析到JvmTest.incre()方法導(dǎo)致的,我們直接來(lái)看對(duì)應(yīng)代碼    

@Controller
@RequestMapping("/jvmtest")
public class JvmTest {
? ? @RequestMapping(path = "/increment", method = RequestMethod.GET)
? ? public String incre() {
? ? ? ? int i = 0;
? ? ? ? for (int j = 0; j < 10000000; j++) {
? ? ? ? ? ? System.out.println(i++);
? ? ? ? }
? ? ? ? return "success";
? ? }
}

很容易看出來(lái),就是這個(gè)for循環(huán)導(dǎo)致的。

注意:

java應(yīng)用CPU飆高的問(wèn)題并不難排查,按照這種標(biāo)準(zhǔn)方式來(lái)查,并沒(méi)有解決不了的問(wèn)題。

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java instanceof關(guān)鍵字用法詳解及注意事項(xiàng)

    Java instanceof關(guān)鍵字用法詳解及注意事項(xiàng)

    instanceof 是 Java 的保留關(guān)鍵字。它的作用是測(cè)試它左邊的對(duì)象是否是它右邊的類的實(shí)例,返回 boolean 的數(shù)據(jù)類型。本文重點(diǎn)給大家介紹Java instanceof關(guān)鍵字用法詳解及注意事項(xiàng),需要的朋友參考下吧
    2021-09-09
  • 微服務(wù)mybatis?typehandler使用詳解(就這一篇夠了)

    微服務(wù)mybatis?typehandler使用詳解(就這一篇夠了)

    TypeHandler是MyBatis框架的核心組件,實(shí)現(xiàn)數(shù)據(jù)庫(kù)表字段類型和Java?數(shù)據(jù)類型之間的相互轉(zhuǎn)換,本文介紹通過(guò)實(shí)例代碼mybatis?typehandler使用,感興趣的朋友一起看看吧
    2024-02-02
  • SpringCloud Stream消息驅(qū)動(dòng)實(shí)例詳解

    SpringCloud Stream消息驅(qū)動(dòng)實(shí)例詳解

    這篇文章主要介紹了SpringCloud Stream消息驅(qū)動(dòng)的相關(guān)知識(shí),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-03-03
  • springcloud?feign服務(wù)之間調(diào)用,date類型轉(zhuǎn)換錯(cuò)誤的問(wèn)題

    springcloud?feign服務(wù)之間調(diào)用,date類型轉(zhuǎn)換錯(cuò)誤的問(wèn)題

    這篇文章主要介紹了springcloud?feign服務(wù)之間調(diào)用,date類型轉(zhuǎn)換錯(cuò)誤的問(wèn)題及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • Java使用DateUtils對(duì)日期進(jìn)行數(shù)學(xué)運(yùn)算經(jīng)典應(yīng)用示例【附DateUtils相關(guān)包文件下載】

    Java使用DateUtils對(duì)日期進(jìn)行數(shù)學(xué)運(yùn)算經(jīng)典應(yīng)用示例【附DateUtils相關(guān)包文件下載】

    這篇文章主要介紹了Java使用DateUtils對(duì)日期進(jìn)行數(shù)學(xué)運(yùn)算的方法,可實(shí)現(xiàn)針對(duì)日期時(shí)間的各種常見運(yùn)算功能,并附帶DateUtils的相關(guān)包文件供讀者下載使用,需要的朋友可以參考下
    2017-11-11
  • 使用Java操作MySQL實(shí)現(xiàn)數(shù)據(jù)交互的方法

    使用Java操作MySQL實(shí)現(xiàn)數(shù)據(jù)交互的方法

    JDBC是Java中用于操作數(shù)據(jù)庫(kù)的API,可以為多種關(guān)系數(shù)據(jù)庫(kù)提供統(tǒng)一訪問(wèn),它通過(guò)JDK自帶的JDBC API和數(shù)據(jù)庫(kù)驅(qū)動(dòng)包進(jìn)行操作,實(shí)現(xiàn)數(shù)據(jù)庫(kù)的增刪改查,本文給大家介紹使用Java操作MySQL實(shí)現(xiàn)數(shù)據(jù)交互的方法,感興趣的朋友跟隨小編一起看看吧
    2025-01-01
  • 如何用Intellij idea2020打包jar的方法步驟

    如何用Intellij idea2020打包jar的方法步驟

    這篇文章主要介紹了如何用Intellij idea 2020打包jar的方法步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-04-04
  • 詳解Java sort()數(shù)組排序(升序和降序)

    詳解Java sort()數(shù)組排序(升序和降序)

    這篇文章主要介紹了詳解Java sort()數(shù)組排序(升序和降序),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • 2018版java多線程面試題集合及答案

    2018版java多線程面試題集合及答案

    這篇文章主要為大家詳細(xì)介紹了2018版java多線程面試題集合及答案,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-09-09
  • springBoot項(xiàng)目中的全局異常處理和自定義異常處理實(shí)現(xiàn)

    springBoot項(xiàng)目中的全局異常處理和自定義異常處理實(shí)現(xiàn)

    異常是由于程序邏輯錯(cuò)誤、運(yùn)行環(huán)境問(wèn)題、用戶輸入錯(cuò)誤等原因?qū)е碌囊环N非正常的狀態(tài)或事件,本文主要介紹了springBoot項(xiàng)目中的全局異常處理和自定義異常處理實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-08-08

最新評(píng)論