java cpu100%_[Java] CPU 100% 原因查找解决

本文介绍了解决服务器出现CPU100%死锁的方法,包括使用top命令定位高CPU消耗进程,获取线程堆栈信息,并通过jstack分析具体的线程状态,最后给出了解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

CPU 100%肯定是出现死锁,这个时候观察内存还是够用的,但是CPU一直100%,以下几步解决:

1. 找到进程消耗cpu最大的

$top

top- 11:37:34 up 100 days, 23:25, 1 user, load average: 0.75, 0.60, 0.53Tasks:32 total, 3 running, 29 sleeping, 0 stopped, 0zombie

Cpu(s):11.6%us, 7.0%sy, 0.0%ni, 81.3%id, 0.0%wa, 0.0%hi, 0.0%si, 0.1%st

Mem: 8388608k total, 8381460k used, 7148kfree, 0k buffers

Swap: 1999864k total, 0k used, 1999864kfree, 4089340k cached

PID USER PR NI VIRT RES SHR S%CPU %MEM TIME+COMMAND123530 admin 0 -20 5631m 4.0g 102m S 73.2 49.6 1024:13 java

2. 打出进程中线程占用情况:

$top -p 157030 -H

top- 11:39:46 up 100 days, 23:27, 1 user, load average: 0.63, 0.59, 0.54Tasks:228 total, 0 running, 228 sleeping, 0 stopped, 0zombie

Cpu(s):0.7%us, 0.3%sy, 0.0%ni, 98.8%id, 0.0%wa, 0.0%hi, 0.0%si, 0.2%st

Mem: 8388608k total, 8382160k used, 6448kfree, 0k buffers

Swap: 1999864k total, 0k used, 1999864kfree, 4089636k cached

PID USER PR NI VIRT RES SHR S%CPU %MEM TIME+COMMAND158166 admin 0 -20 5631m 4.0g 102m S 1.0 49.6 31:21.02java157051 admin 0 -20 5631m 4.0g 102m S 0.3 49.6 1:56.39 java

3. dump文件:

$ jstack 123530 > Desktop/jstack.log

4. 找到#2步的PID对应的16进制

$printf %x 158166269d6

5. 在#3的dump文件中找到#4对应的线程堆栈(0x269d6):

zhangdeMacBook-Air:~ zhang$ more Desktop/jstack.log2016-07-17 11:45:20Full thread dump Java HotSpot(TM)64-Bit Server VM (24.79-b02 mixed mode):"Attach Listener" daemon prio=5 tid=0x00007f9aab82a800 nid=0x580b waiting on condition [0x0000000000000000]

java.lang.Thread.State: RUNNABLE"SocketConnectorIoProcessor-0.2" daemon prio=5 tid=0x00007f9aab43b800 nid=0x7003 runnable [0x00000001699a4000]

java.lang.Thread.State: RUNNABLE

at sun.nio.ch.KQueueArrayWrapper.kevent0(Native Method)

at sun.nio.ch.KQueueArrayWrapper.poll(KQueueArrayWrapper.java:200)

at sun.nio.ch.KQueueSelectorImpl.doSelect(KQueueSelectorImpl.java:103)

at sun.nio.ch.SelectorImpl.lockAndDoSelect(SelectorImpl.java:87)- locked <0x00000001585a8078> (a sun.nio.ch.Util$2)- locked <0x00000001585a8088>(a java.util.Collections$UnmodifiableSet)- locked <0x00000001585a8028>(a sun.nio.ch.KQueueSelectorImpl)

at sun.nio.ch.SelectorImpl.select(SelectorImpl.java:98)

at org.apache.mina.transport.socket.nio.SocketIoProcessor$Worker.run(SocketIoProcessor.java:480)

at org.apache.mina.util.NamePreservingRunnable.run(NamePreservingRunnable.java:51)

at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)

at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)

at java.lang.Thread.run(Thread.java:745)

6. 结合dump和代码分析问题原因,一般都能找到原因

查看进程GC情况

sudo -u admin /opt/java/bin/jstat -gcutil 54358 1000

得到Dump文件

sudo -u admin /opt/java/bin/jmap -dump:format=b,file=/tmp/a.bin 54358

通过工具分析dump文件

@echo off rem @echo %cd% rem @echo %~d0 rem @echo %~dp0 rem @echo %~df0 set MD_BOOT_HOME=%~dp0 set CONFIG_ROOT=%MD_BOOT_HOME%\server\config\platform set LIBS_ROOT=%MD_BOOT_HOME%\server\runtime rem set JAVA_HOME_PR=%~dp0jstack echo MD_BOOT_HOME: %MD_BOOT_HOME% echo %1 echo %2 set MD_BOOT_ARCH=%PROCESSOR_ARCHITECTURE% rem @echo %MD_BOOT_ARCH% set MD_BOOT_OS_KERNEL=win rem @echo %MD_BOOT_OS_KERNEL% @REM ==== START VALIDATION ==== if not "%JAVA_HOME%" == "" goto OkJHome echo. echo Error: JAVA_HOME not found in your environment. >&2 echo Please set the JAVA_HOME variable in your environment to match the >&2 echo location of your Java installation. >&2 echo. goto error :error set ERROR_CODE=1 @REM Set JAVA_HOME=%JAVA_HOME_PR%\runtime\java\%MD_BOOT_ARCH%-%MD_BOOT_OS_KERNEL% :OkJHome echo Checking java home: %JAVA_HOME% if exist "%JAVA_HOME%\bin\java.exe" goto doJob :doJob @setlocal enabledelayedexpansion for /r "%MD_BOOT_HOME%\" %%k in (lcm-metadata-shell*.jar) do ( @set MD_BOOTSTRAP="%%k" ) for /r "%MD_BOOT_HOME%\server\platform\dev\main" %%k in (*.jar) do set MAIN_JAR=%%k echo Checking MD bootstrap: %MD_BOOTSTRAP% echo "%JAVA_HOME%\bin\java" -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005 -jar %MD_BOOTSTRAP% %* "%JAVA_HOME%\bin\java" ^ -Dloader.path="%MD_BOOT_HOME%\server\platform\common;%MD_BOOT_HOME%\server\platform\dev\main;%LIBS_ROOT%\libs;%LIBS_ROOT%\3rd;lib\" ^ -Dspring.config.additional-location="%CONFIG_ROOT%\common;%CONFIG_ROOT%\dev" ^ -jar %MD_BOOTSTRAP% %* pause,解释
最新发布
03-11
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值