Linux下java服务占用cpu过高如何处理
-
top命令查看进程信息
top
-
按下
shift+p
,按cpu使用率排行,可见进程1932
占用最高,并且是一个java服务 -
使用jps命令确认java服务
[root@VM-16-16-centos ~]# jps 1011 Jps 9462 yuan_back-0.0.1-SNAPSHOT.jar 1932 spigot-1.18.jar
-
查找异常进程中的异常线程
top -H -p [pid]
-
将异常线程的pid转为16进制
printf "%x\n" pid
[root@VM-16-16-centos ~]# printf "%x\n" 2035 7f3
-
使用jstack定位异常线程代码
jstack [进程pid] | grep -A 10 [16进制线程pid]
[root@VM-16-16-centos ~]# jstack 1932 | grep -A 10 7f3 "Server thread" #22 prio=5 os_prio=0 cpu=690162281.71ms elapsed=4553857.35s tid=0x00007ff5ee745ac0 nid=0x7f3 runnable [0x00007ff6019b9000]java.lang.Thread.State: RUNNABLEat net.minecraft.world.level.block.BlockFire.a(BlockFire.java:227)at net.minecraft.world.level.block.state.BlockBase$BlockData.a(BlockBase.java:911)at net.minecraft.server.level.WorldServer.d(WorldServer.java:776)at net.minecraft.server.level.WorldServer$$Lambda$4882/0x0000000801800678.accept(Unknown Source)at net.minecraft.world.ticks.TickListServer.a(SourceFile:215)at net.minecraft.world.ticks.TickListServer.a(SourceFile:98)at net.minecraft.server.level.WorldServer.a(WorldServer.java:341)at net.minecraft.server.MinecraftServer.b(MinecraftServer.java:1300)at net.minecraft.server.dedicated.DedicatedServer.b(DedicatedServer.java:428)
这样就定位到异常代码,并可以进行具体分析了