同样代码 linux下cpu过高,linux cpu过高原因及代码定位

通过`top`命令发现进程PID35163的CPU和内存占用率高,进一步使用`ps`命令查看该进程详细信息,定位到Java进程及其线程。线程35169和35204存在高CPU使用情况。通过`jstack`分析线程栈,发现在`LmsThread.java:68`行存在死循环。解决方法包括检查代码中可能的死循环,尤其是`while (true)`结构,并考虑完整删除项目文件夹并重新部署以解决问题。
摘要由CSDN通过智能技术生成

1. top命令查看CPU和内存占用率

top回车,然后按1

发现进程PID 35163 CPU和内存占用率都很高

top - 06:13:47 up  5:31,  1 user,  load average: 2.11, 2.07, 2.06

Tasks: 189 total,   1 running, 188 sleeping,   0 stopped,   0 zombie

Cpu0  : 22.3%us,  0.7%sy,  0.0%ni, 76.4%id,  0.3%wa,  0.3%hi,  0.0%si,  0.0%st

Cpu1  :100.0%us,  0.0%sy,  0.0%ni,  0.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st

Cpu2  :  8.0%us,  0.3%sy,  0.0%ni, 91.7%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st

Cpu3  : 70.4%us,  1.7%sy,  0.0%ni, 25.6%id,  2.3%wa,  0.0%hi,  0.0%si,  0.0%st

Mem:   1012292k total,   943076k used,    69216k free,     9372k buffers

Swap:  1675260k total,   375204k used,  1300056k free,    34024k cached

PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND

35163 user111   20   0 3823m 360m 6828 S 199.5 36.5 147:41.46 java

另外,top下,按H可以在进程PID和线程TID之间切换

2. 查看PID对应的进程

[user111@kms210 lms]$ ps -ef|grep 35163

user111  35163     1 99 04:59 pts/0    02:28:06 /usr/local/jdk1.8.0_60/bin/java -Djava.util.logging.config.file=/usr/local/lms/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.awt.headless=true -Djava.endorsed.dirs=/usr/local/lms/endorsed -classpath /usr/local/lms/bin/bootstrap.jar:/usr/local/lms/bin/tomcat-juli.jar -Dcatalina.base=/usr/local/lms -Dcatalina.home=/usr/local/lms -Djava.io.tmpdir=/usr/local/lms/temp org.apache.catalina.startup.Bootstrap start

user111  44605 23049  0 06:14 pts/0    00:00:00 grep 35163

3. 查看线程35163中占用CPU高的进程

[user111@kms210 lms]$ ps -mp 35163 -o THREAD,tid,time

USER     %CPU PRI SCNT WCHAN  USER SYSTEM   TID     TIME

user111   199   -    - -         -      -     - 02:32:04

user111   0.0  19    - futex_    -      - 35163 00:00:00

user111   0.0  19    - poll_s    -      - 35164 00:00:01

user111   0.0  19    - futex_    -      - 35165 00:00:01

user111   0.0  19    - futex_    -      - 35166 00:00:00

user111   0.0  19    - futex_    -      - 35167 00:00:00

user111   0.0  19    - futex_    -      - 35168 00:00:00

user111   0.3  19    - futex_    -      - 35169 00:00:16

user111   0.3  19    - futex_    -      - 35170 00:00:16

user111   0.1  19    - futex_    -      - 35171 00:00:05

user111   0.0  19    - futex_    -      - 35172 00:00:00

user111   0.0  19    - futex_    -      - 35173 00:00:01

user111   0.0  19    - futex_    -      - 35174 00:00:00

user111   0.0  19    - futex_    -      - 35178 00:00:00

user111   0.0  19    - ep_pol    -      - 35181 00:00:00

user111   0.0  19    - ep_pol    -      - 35182 00:00:00

user111   0.0  19    - ep_pol    -      - 35183 00:00:00

user111  99.6  19    - -         -      - 35204 01:15:33

user111   0.0  19    - futex_    -      - 35222 00:00:00

user111  99.6  19    - -         -      - 35226 01:15:27

user111   0.0  19    - futex_    -      - 35230 00:00:00

线程TID转16进制

[user111@kms210 lms]$ printf "%x\n" 35204

8984

4.查看线程栈信息

[user111@kms210 lms]$ jstack 35163 | grep 8984 -A 30

"Thread-6" #18 daemon prio=5 os_prio=0 tid=0x00007fb0d8fd1800 nid=0x8984 runnable [0x00007fb11cc8e000]

java.lang.Thread.State: RUNNABLE

at com.qsd.sssm.thread.LmsThread.run(LmsThread.java:68)

"NioBlockingSelector.BlockPoller-3" #15 daemon prio=5 os_prio=0 tid=0x00007fb130531800 nid=0x896f runnable [0x00007fb11dfb2000]

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:79)

at sun.nio.ch.SelectorImpl.lockAndDoSelect(SelectorImpl.java:86)

- locked <0x00000000f62278e8> (a sun.nio.ch.Util$2)

- locked <0x00000000f62278f8> (a java.util.Collections$UnmodifiableSet)

- locked <0x00000000f62278a0> (a sun.nio.ch.EPollSelectorImpl)

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

at org.apache.tomcat.util.net.NioBlockingSelector$BlockPoller.run(NioBlockingSelector.java:342)

"NioBlockingSelector.BlockPoller-2" #14 daemon prio=5 os_prio=0 tid=0x00007fb130517000 nid=0x896e runnable [0x00007fb11e0b3000]

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:79)

at sun.nio.ch.SelectorImpl.lockAndDoSelect(SelectorImpl.java:86)

- locked <0x00000000f6227b20> (a sun.nio.ch.Util$2)

- locked <0x00000000f6227b30> (a java.util.Collections$UnmodifiableSet)

- locked <0x00000000f6227ad8> (a sun.nio.ch.EPollSelectorImpl)

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

at org.apache.tomcat.util.net.NioBlockingSelector$BlockPoller.run(NioBlockingSelector.java:342)

"NioBlockingSelector.BlockPoller-1" #13 daemon prio=5 os_prio=0 tid=0x00007fb130474800 nid=0x896d runnable [0x00007fb11e3cd000]

java.lang.Thread.State: RUNNABLE

at sun.nio.ch.EPollArrayWrapper.epollWait(Native Method)

[user111@kms210 lms]$

找到出现问题的代码,并分析具体函数中是否有可能出现死循环的代码段。

通常问题出现在while, for之类的循环代码片段。

5. 查看文件LmsThread.java:68行

Debug一下,发现死循环

while (true) {

if(CMD.remoteIp.equals("")) {// 第58行,if成立,死循环

continue;

}

6. 另外,只替换.war文件可能存在的问题

修改只替换.war文件,可能会发现线程占用率还是很高,线程栈信息仍然显示以前的行号的话,可以试试完整的删除项目文件夹,重新部署整个项目

参考地址:http://blog.csdn.net/chenhaotong/article/details/51991786

Linux排查java程序占用cpu过高的线程代码

分几步骤: 1.通过top,查出占用CPU过高的java进程 ,比如: pid :6666 2.通过ps -mp 6666 -o THREAD,tid,time| sort -n -k1 -r 查看此 ...

linux下查找java进程占用CPU过高原因

1. 查找进程 top查看进程占用资源情况 明显看出java的两个进程22714,12406占用过高cpu.   2.查找线程 使用top -H -p 查看线程占用情况   3. ...

linux查询cpu过高原因--java

1. 查询java pid top -c 2. 查询java进程下,线程情况 top -Hp pid(threadIdList) 3. 将10进制线程id转为16进制 printf "%x ...

线上CPU飚高(死循环,死锁……)?帮你迅速定位代码位置

top基本使用: top命令参考本篇文章 查看内存和CPU的top命令,别看输出一大堆,理解了其实很简单 top 命令运行图: 第一行:基本信息 第二行:任务信息 第三行:CPU使用情况 第四行:物理 ...

Linux 线程占用CPU过高定位分析

今天朋友问我一个Linux程序CPU占用涨停了,该如何分析, CPU占用过高,模拟CPU占用过高的情况 先上一段代码: #include #include

查找linux下进程占用CPU过高的原因,以php-fpm为例

很多时候,线上服务器的进程在某时间段内长时间占用CPU过高,为了优化,我们需要找出原因. 1.找出占用CPU最高的10个进程 ps aux | sort -k3nr | head -n 10 或查看占 ...

jstack命令定位java程序CPU利用率高的代码位置

高手是怎么使用jstack精确找到异常代码的(java程序CPU利用率高的情况) 请jstack神器来帮忙 本文介绍Linux环境下使用jstack定位问题的秘笈1.[top命令]找到CPU利用率持续 ...

JVM 之 Linux定位CPU过高问题及优化

项目部署以后出行卡顿现象,所以对问题进行了排查,记录一下排查过程 (从CSDN编辑器贴过来的,图有水印) 1.找进程 top 可以发现,是Java进程导致的CPU过高,致使系统卡顿 2.找线程 ps ...

关于linux系统CPU篇---&gt&semi;不容易发现的占用CPU较高进程

1.系统的CPU使用率,不仅包括进程用户态和内核态的运行,还包括中断处理,等待IO以及内核线程等等.所以,当你发现系统的CPU使用率很高的时候,不一定能找到相对应的高CPU使用率的进程 2.案例分析, ...

随机推荐

JavaScript中让Html页面中循环播放文字

JavaScript中让Html页面中循环播放文字

AngularJS时间轴指令

是基于ion.rangeSlider.js,主要代码如下:

HDU2296——Ring(AC自动机&plus;DP)

题意:输入N代表字符串长度,输入M代表喜欢的词语的个数,接下来是M个词语,然后是M个词语每个的价值.求字符串的最大价值.每个单词的价值就是单价*出现次数.单词可以重叠.如果不止一个答案,选择字典序最小 ...

CentOS 5上Apache配置虚拟主机范例

昨天实践了下在CentOS 5上通过Apache直接配置虚拟主机,服务器没有安装面板软件,所以只能通过SSH远程连接操作了.Apache安装在/etc/httpd目录下,这个即是Apache的根目录, ...

Winform通用模块之流水号生成

打算接下来的时间里把自己觉得用起来还比较好用的通用模块,在这里向大家介绍一下,如果你有更好的想法时,也希望你不吝指点. 1.数据库表及存储过程 在介绍这个通用流水号生成的模块前,我们先来看一下其相关的 ...

Ubuntu环境下IPython的搭建和使用

1. Ubuntu操作系统版本 说明:Ubuntu 12.04.3 LTS自带的Python 2.7.3版本. 2. 安装IPython 说明: 输入命令sudo apt-get install ip ...

一张图了解cocos2d坐标系

一张图了解cocos2d坐标系 平面直角坐标系

niagara Workbench module import IntelliJ

1. 在整个网络布线中使用一种布线方式,但是两端都有RJ-45 plug  的网络连线,无论是采用方式A还是方式B 端接的方式都是试用的.网络都是通用的,双绞线的顺序与RJ-45偶的引脚序号一一对应, ...

pm2

使用PM2将Node.js的集群变得更加容易(http://www.cnblogs.com/jaxu/p/5193643.html) nodejs pm2配置使用教程(http://blog.csdn ...

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值