java程序占用cpu100%问题查找方案
目录
- 一、背景
- 二、使用top命令确定是哪个java程序占用高,找到对应pid
- 三、查看Java应用中线程CPU占比
- 四、查看线程信息
- 五、定位具体代码
- 六、转16进制的方法主要有以下几种(下面的10659就是pid)
一、背景
- 一个java程序今天被告知在linux上cpu 100%,一开始有点难以置信,连上去top命令一看还真是一直"稳定"占用cpu100%;还好机子是多核心的,不然就"GG"了。然后我打开idea在本地运行那个程序,一切正常;后面才知道windows和linux(任务管理)不一样。后面选择在linux上检查问题了。这里记录下解决步骤。
windows和linux任务管理的不一样:
默认情况下,top在Linux上运行所谓的IRIX模式,而Windows任务管理器不运行。假设您有4个核心:
IRIX模式打开时,1个完全利用的内核为100%,4个内核为400%。
IRIX模式关闭时,1个完全利用的内核为25%,4个内核为100%。
这意味着默认情况下,top上的Linux将显示一个无限循环为〜100%,Windows将显示为〜25%,这意味着完全相同的事情。可以在顶部使用Shift i运行时切换IRIX模式。这将使数字匹配
二、使用top命令确定是哪个java程序占用高,找到对应pid
- top命令然后输入小写的m,占用cpu最大的就是第一个了。
top - 09:59:48 up 41 days, 22:14, 2 users, load average: 1.12, 1.10, 1.07
Tasks: 175 total, 1 running, 174 sleeping, 0 stopped, 0 zombie
%Cpu(s): 26.8 us, 0.6 sy, 0.0 ni, 72.4 id, 0.0 wa, 0.0 hi, 0.2 si, 0.0 st
KiB Mem : 33.4/32666536 [|||||||||||||||||||||||||||||||||| ]
KiB Swap: 0.0/16449532 [ ]PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
10614 root 20 0 4710976 455404 14056 S 100.0 1.4 18:42.23 java
19944 root 20 0 4835164 444860 22456 S 12.3 1.4 130:22.13 java
19812 root 20 0 4815532 396516 21928 S 0.7 1.2 2:42.83 java
26474 root 20 0 10.8g 215284 13644 S 0.7 0.7 52:01.01 java 5611 root 20 0 573920 17144 6004 S 0.3 0.1 5:54.83 tuned 6064 root 20 0 147760 3756 388 S 0.3 0.0 10:13.76 fdfs_trackerd
19706 root 20 0 4822796 402220 22432 S 0.3 1.2 1:02.62 java
19762 root 20 0 4817108 404852 22440 S 0.3 1.2 2:09.45 java
20031 root 20 0 4801696 502096 22456 S 0.3 1.5 0:48.54 java
20076 root 20 0 4815268 382280 21920 S 0.3 1.2 2:50.58 java
20166 root 20 0 3719700 2.2g 13720 S 0.3 7.2 475:04.63 mongod
20260 root 20 0 3189808 1.7g 12664 S 0.3 5.6 397:56.43 mongod
22781 root 20 0 4720796 565004 14176 S 0.3 1.7 5:43.88 java
28209 root 20 0 0 0 0 S 0.3 0.0 0:04.46 kworker/2:0 ........ 省略
三、查看Java应用中线程CPU占比
- 找到这个pid
10614
,使用命令top -p 10614 -H
查看应用中的线程情况。
top - 10:07:57 up 41 days, 22:22, 2 users, load average: 1.11, 1.09, 1.06
Threads: 69 total, 1 running, 68 sleeping, 0 stopped, 0 zombie
%Cpu(s): 26.8 us, 0.4 sy, 0.0 ni, 72.6 id, 0.0 wa, 0.0 hi, 0.2 si, 0.0 st
KiB Mem : 32666536 total, 2127136 free, 10375580 used, 20163820 buff/cache
KiB Swap: 16449532 total, 16449532 free, 0 used. 21745244 avail Mem PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
10659 root 20 0 4710976 450360 14056 R 99.9 1.4 26:34.05 java
10614 root 20 0 4710976 450360 14056 S 0.0 1.4 0:00.00 java
10616 root 20 0 4710976 450360 14056 S 0.0 1.4 0:03.56 java
10617 root 20 0 4710976 450360 14056 S 0.0 1.4 0:00.05 java
10618 root 20 0 4710976 450360 14056 S 0.0 1.4 0:00.06 java
10619 root 20 0 4710976 450360 14056 S 0.0 1.4 0:00.06 java
10620 root 20 0 4710976 450360 14056 S 0.0 1.4 0:00.06 java
10621 root 20 0 4710976 450360 14056 S 0.0 1.4 0:00.05 java
10622 root 20 0 4710976 450360 14056 S 0.0 1.4 0:00.07 java
10623 root 20 0 4710976 450360 14056 S 0.0 1.4 0:00.06 java
10624 root 20 0 4710976 450360 14056 S 0.0 1.4 0:00.07 java
10625 root 20 0 4710976 450360 14056 S 0.0 1.4 0:00.00 java
10626 root 20 0 4710976 450360 14056 S 0.0 1.4 0:00.00 java
10627 root 20 0 4710976 450360 14056 S 0.0 1.4 0:00.00 java
10628 root 20 0 4710976 450360 14056 S 0.0 1.4 0:00.00 java
10629 root 20 0 4710976 450360 14056 S 0.0 1.4 0:00.00 java
10630 root 20 0 4710976 450360 14056 S 0.0 1.4 0:00.00 java
10631 root 20 0 4710976 450360 14056 S 0.0 1.4 0:00.00 java
10632 root 20 0 4710976 450360 14056 S 0.0 1.4 0:00.00 java
10633 root 20 0 4710976 450360 14056 S 0.0 1.4 0:00.01 java
10634 root 20 0 4710976 450360 14056 S 0.0 1.4 0:00.16 java
10635 root 20 0 4710976 450360 14056 S 0.0 1.4 0:00.00 java
10636 root 20 0 4710976 450360 14056 S 0.0 1.4 0:00.01 java ........ 省略
- 下面又定位到
10659
这个pid
四、查看线程信息
- 要将
10659
这个pid转16进制,数字转16进制的网站 ,https://tool.lu/hexconvert/ 也可以自己写程序,如python使用hex(10659)
。 jstack 10614 |grep -A 50 0x29a3
jstack是jdk内置命令用来分析线程状态的。
"pool-1-thread-1" #23 prio=5 os_prio=0 tid=0x00007f8f363f5800 nid=0x29a3 runnable [0x00007f8ec483f000]java.lang.Thread.State: RUNNABLEat com.xx.article.chat.websocket.protocol.ProcessorFileTransfer$1.run(ProcessorFileTransfer.java:60)at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)at java.lang.Thread.run(Thread.java:748)"DelayQueueMonitor" #22 prio=5 os_prio=0 tid=0x00007f8f35ba7800 nid=0x29a2 waiting on condition [0x00007f8ec4880000]java.lang.Thread.State: WAITING (parking)at sun.misc.Unsafe.park(Native Method)- parking to wait for <0x00000000ca14a858> (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.DelayQueue.take(DelayQueue.java:211)at com.xx.article.chat.queue.DelayOrderQueueManager.execute(DelayOrderQueueManager.java:81)at com.xx.article.chat.queue.DelayOrderQueueManager.lambda$init$0(DelayOrderQueueManager.java:67)at com.xx.article.chat.queue.DelayOrderQueueManager$$Lambda$497/838812606.run(Unknown Source)at java.lang.Thread.run(Thread.java:748)........ 省略
五、定位具体代码
- 基本上最有用的信息就是这段
com.xx.article.chat.websocket.protocol.ProcessorFileTransfer$1.run(ProcessorFileTransfer.java:60)
- 找到原因了主要问题还是在那个死循环,一直在占用cpu(自己写的垃圾代码,坑)。
六、转16进制的方法主要有以下几种(下面的10659就是pid)
- 1、linux直接运行
printf "%x\n" 10659
- 2、自己写程序,如python使用
hex(10659)
- 3、在线转16进制的网站 ,如https://tool.lu/hexconvert/
- 4、网页上按F12,在Console输入 ,
a = 10659;a.toString(16);
java程序占用cpu100%问题查找方案相关推荐
- Java占Linux超过xms,linux下分析java程序占用CPU、内存过高
一.CPU过高分析 1)使用TOP命令查看CPU.内存使用状态可以发现CPU占用主要分为两部分,一部分为系统内核空间占用CPU百分比,一部分为用户空间占用CPU百分比.其中CPU状态中标示id的为空闲 ...
- Java程序占用 CPU 过高怎么排查
Java程序占用 CPU 过高怎么排查 线上一台服务器 CPU 使用率100% 了,如果你碰到这样的情况,如何排查并找到问题原因? 这就是一个套路题,所谓套路题就是有标准的套路解法的,掌握了套路,不仅 ...
- java程序占用实际内存大小
一.java程序占用实际内存大小 1.1.java命令启动参数-Xms -Xmx的问题 启动命令如下:java -server -Xms128m -Xmx128m -jar ****. ...
- java 解除文件占用_Java如何强制删除java程序占用的文件
在JAVA对文件的读写操作中,操作完以后将输入流和输出流及时关闭时很必要的.假如我们有时候忘记关闭了,又不知道在哪个地方去关闭,为了删除该文件,JAVA可以进行强制删除操作.可以使用如下代码进行强制删 ...
- window服务器cpu过高的排查_高频面试题:Java程序占用 CPU 过高怎么排查
这个问题可以说是 Java 面试的高频面试题了,有很多面试官都喜欢问这个问题,问题可能是下面这样的. 线上一台服务器 CPU 使用率100% 了,如果你碰到这样的情况,如何排查并找到问题原因? 这就是 ...
- java线程占用CPU_在windows下揪出java程序占用cpu很高的线程并完美解决
我的一个java程序偶尔会出现cpu占用很高的情况 一直不知道什么原因 今天终于抽时间解决了 系统是win2003 jvisualvm 和 jconsole貌似都只能看到总共占用的cpu 看不到每个线 ...
- java程序cpu突然飚高_高频面试题:Java程序占用 CPU 过高怎么排查
这个问题可以说是 Java 面试的高频面试题了,有很多面试官都喜欢问这个问题,问题可能是下面这样的.线上一台服务器 CPU 使用率100% 了,如果你碰到这样的情况,如何排查并找到问题原因? 这就是一 ...
- linux 内核空间占用cpu百分比过高,linux下分析java程序占用CPU、内存过高
一.CPU过高分析 1)使用TOP命令查看CPU.内存使用状态可以发现CPU占用主要分为两部分,一部分为系统内核空间占用CPU百分比,一部分为用户空间占用CPU百分比.其中CPU状态中标示id的为空闲 ...
- 怎么测试一个java程序占用的内存和cpu消耗?
1.测试查看单独的class的资源消耗方法. Runtime r = Runtime.getRuntime(); long freeMemory = r.freeMemory(); long ...
最新文章
- 重要通知:招募200程序员,免费培训金融知识,不限年龄,有意者进!
- pack_padded_sequence 和 pad_packed_sequence
- redis 安装使用
- C89与C99标准比较
- linux winrar 安装目录,WinRAR 5.61发布,提供Linux版本下载,附安装方法
- improve怎么加ing_雅思写作7分秘籍:Niko原创大作文写作机经教你怎么得高分!
- TCP协议的部分解析(1)
- Spring mybatis源码学习指引目录
- PoJ3278--Catch That Cow(Bfs)
- 基于junit4的关于个人所得税计算的等价类与边界值_测试用例的设计方法--边界值分析方法...
- 答题器真的什么问题都能答出来吗?
- 住房公积金约定提取业务问答
- Maven学习笔记__上篇
- 路由之间的转跳及传参
- java中jar包怎么下载
- 净亏10.89亿欧元!法雷奥:2021年仍需保持谨慎,ADAS业务表现最佳
- Hexo博客配置SSL证书
- 软件需求工程-方法总结
- 树莓派配置热点官网操作指引-(备份)
- android 9 所有应用的行为变更 和 以API28为目标的应用行为变更
热门文章
- 什么是软件开发领域的 obsolete 或者 deprecated 含义
- Springboot+vue整合
- 计网PPT 第七章 网络安全
- 【Matlab】用程序制作简单音乐
- 一些有影响的博客推荐
- Hydra教程——非常详细
- FZU Monthly-201910 tutorial
- Python之CSV文件操作
- 计算机科普知识宣讲实践,【三下乡进行时】增强科技意识 提高生活质量——新疆大学2018年“两学一实践”科普大宣讲社会实践信息科学与工程学院分队走进莎车县伯什坎特乡...
- csharp高级练习题:Codewars风格排名系统【难度:4级】--景越C#经典编程题库,不同难度C#练习题,适合自学C#的新手进阶训练