最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

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

1.使用top命令查看使用CPU過高的進(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過高的線程

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對應(yīng)16進(jìn)制45a),用這個值過濾 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]

這樣就能定位到有問題的線程了。

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

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

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

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

無外乎就是,某個線程執(zhí)行執(zhí)行耗CPU的動作了。

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

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

1.準(zhǔn)備工作

1.1 安裝并啟動docker tomcat

# 1.拉取tomcat鏡像
hxw@hxwdeMacBook-Pro ~ % docker pull tomcat
# 2.完成后,啟動一個tomcat容器
# tomcat默認(rèn)啟動端口為8080,將該端口映射到Mac的8088上
hxw@hxwdeMacBook-Pro ~ % docker run -p 8088:8080 -d tomcat
# 3.啟動完成后,通過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啟動
# 通過瀏覽器訪問 localhost:8088,出現(xiàn)tomcat即可

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

war包中有一個方法會引起CPU飆高,文章最后再做說明
# 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飆高問題

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

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

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

# 1.通過docker exec命令進(jìn)入
hxw@hxwdeMacBook-Pro ~ % docker exec -it 606ca0c7f783 /bin/bash
root@606ca0c7f783:/usr/local/tomcat#?
# 2.安裝JDK,筆者這里默認(rèn)沒有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也沒有,也需要安裝的(讀者如果還需要其他命令,可自行安裝,按照debain的方式來安裝即可)

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,就是這個進(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的這個線程,占用了99.8%的CPU,那么我們直接分析這個線程就可以了

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

# 1.將進(jìn)程號=1的進(jìn)程棧信息導(dǎo)出到2.txt中
root@606ca0c7f783:/usr/local/tomcat# jstack 1 > 2.txt
# 2.將線程號轉(zhuǎn)換為16進(jìn)制(3388就是2.3中查出來的線程號)
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 通過代碼驗(yàn)證分析正確性

既然分析到JvmTest.incre()方法導(dǎo)致的,我們直接來看對應(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";
? ? }
}

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

注意:

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

總結(jié)

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

相關(guān)文章

  • spring整合shiro框架的實(shí)現(xiàn)步驟記錄

    spring整合shiro框架的實(shí)現(xiàn)步驟記錄

    Shiro是一個強(qiáng)大易用的Java安全框架,提供了認(rèn)證、授權(quán)、加密和會話管理等功能。下面這篇文章主要給大家介紹了關(guān)于spring整合shiro框架的實(shí)現(xiàn)步驟,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2018-05-05
  • Java實(shí)現(xiàn)TCP互發(fā)消息

    Java實(shí)現(xiàn)TCP互發(fā)消息

    這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)TCP互發(fā)消息,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-07-07
  • Eclipse配置tomcat發(fā)布路徑的問題wtpwebapps解決辦法

    Eclipse配置tomcat發(fā)布路徑的問題wtpwebapps解決辦法

    這篇文章主要介紹了Eclipse配置tomcat發(fā)布路徑的問題wtpwebapps解決辦法的相關(guān)資料,需要的朋友可以參考下
    2017-06-06
  • Java 泛型總結(jié)(二):泛型與數(shù)組

    Java 泛型總結(jié)(二):泛型與數(shù)組

    數(shù)組與泛型的關(guān)系還是有點(diǎn)復(fù)雜的,Java 中不允許直接創(chuàng)建泛型數(shù)組。本文分析了其中原因并且總結(jié)了一些創(chuàng)建泛型數(shù)組的方式。具有很好的參考價值。下面跟著小編一起來看下吧
    2017-03-03
  • Springboot詳解RocketMQ實(shí)現(xiàn)消息發(fā)送與接收流程

    Springboot詳解RocketMQ實(shí)現(xiàn)消息發(fā)送與接收流程

    這篇文章主要介紹了SpringBoot整合RocketMQ實(shí)現(xiàn)消息發(fā)送和接收功能,我們使用主流的SpringBoot框架整合RocketMQ來講解,使用方便快捷,本文分步驟給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2022-06-06
  • idea根據(jù)實(shí)體類生成數(shù)據(jù)庫表的流程步驟

    idea根據(jù)實(shí)體類生成數(shù)據(jù)庫表的流程步驟

    在開發(fā)的時候,經(jīng)常會遇到數(shù)據(jù)庫表結(jié)構(gòu)設(shè)計(jì)無法滿足業(yè)務(wù)的需求,需要去改動數(shù)據(jù)庫表,我們就需要去設(shè)計(jì)數(shù)據(jù)庫的字段,然后又回來增加實(shí)體類里的字段,這樣很麻煩,所以本文給大家介紹了idea根據(jù)實(shí)體類生成數(shù)據(jù)庫表的流程步驟,需要的朋友可以參考下
    2024-12-12
  • springboot項(xiàng)目中后端接收前端傳參的方法示例詳解

    springboot項(xiàng)目中后端接收前端傳參的方法示例詳解

    這篇文章主要介紹了springboot項(xiàng)目中一些后端接收前端傳參的方法,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-06-06
  • Java獲取服務(wù)器狀態(tài)之CPU、內(nèi)存、存儲等核心信息監(jiān)控全攻略

    Java獲取服務(wù)器狀態(tài)之CPU、內(nèi)存、存儲等核心信息監(jiān)控全攻略

    作為一名剛?cè)胄械腏ava開發(fā)者,了解如何獲取服務(wù)器的CPU和內(nèi)存使用情況是一項(xiàng)基本技能,這篇文章主要介紹了Java獲取服務(wù)器狀態(tài)之CPU、內(nèi)存、存儲等核心信息監(jiān)控的相關(guān)資料,需要的朋友可以參考下
    2026-04-04
  • SpringBoot加載bean的八種方式總結(jié)

    SpringBoot加載bean的八種方式總結(jié)

    springboot難免要用到bean,但這些bean如何導(dǎo)入,對于初學(xué)者時間頭疼的事,下面這篇文章主要給大家介紹了關(guān)于SpringBoot加載bean的八種方式,需要的朋友可以參考下
    2022-10-10
  • 解讀StringBuilder為何比String節(jié)省效率

    解讀StringBuilder為何比String節(jié)省效率

    StringBuilder比String節(jié)省效率的原因主要在于其可變性和性能開銷的降低,StringBuilder在內(nèi)部維護(hù)一個字符數(shù)組,可以直接在原有基礎(chǔ)上修改,避免了每次拼接時的額外復(fù)制操作
    2024-12-12

最新評論

昌图县| 濮阳县| 星座| 拜城县| 华安县| 三原县| 浑源县| 来安县| 广水市| 辽阳县| 从江县| 息烽县| 剑河县| 施甸县| 高台县| 宿松县| 凌源市| 土默特右旗| 安平县| 桃园县| 衢州市| 邢台县| 格尔木市| 滕州市| 禄丰县| 紫金县| 晴隆县| 南溪县| 慈溪市| 海兴县| 庆安县| 新宾| 云浮市| 永德县| 尤溪县| 浮梁县| 哈密市| 湄潭县| 内黄县| 桃园县| 黄梅县|