linux终端下用 top命令看到cpu占用超过100%。之所以超过100%。说明cpu是多核。默认top显示的是cpu加起来的使用率,运行top后按大键盘1看看,可以显示每个cpu的使用率,top里显示的是把所有使用率加起来。如果是4核cpu占用率最高可达400%。

java进程占用CPU过高常见的两种情况及分析定位

https://blog.csdn.net/dingjianmin/article/details/85705812

在linux中的定位方法
4.1.找到CPU占用高的进程号 如:使用top命令查看(可以使用其它方法,只要找到对应的进程号即可)

注:图中第一列PID为进程号;

4.2、根据进程号找到CPU占用高的线程
如:使用命令top -H -p (其中要换成第一步找到的进程号)

top连接参数说明

-H :Threads-mode operation
Instructs top to display individual threads. Without this command-line option a summation of all threads in each process is shown. Later this can be changed with the `H' interactive command.
 
-p :Monitor-PIDs mode as: -pN1 -pN2 ... or -pN1,N2,N3 ...
Monitor only processes with specified process IDs. This option can be given up to 20 times, or you can provide a comma delimited list with up to 20 pids. Co-mingling both approaches is permitted.
1
2
查看某个进程内部线程占用情况分析:
top -H -p 18605

注:图中第一列PID此时为线程号;

4.3.导出java进程执行堆栈,并找到对应的线程
使用jstack > jstack_xxx.txt (其中要换成第一步找到的进程号)
从第二步中的PID中找出一个CPU占用高的线程号,把它转成16进制,比如3261转成CBD
从导出的堆栈信息里找到nid为cbd的线程堆栈

https://www.cnblogs.com/wuchanming/p/7766994.html

4.4:从堆栈里找到对应的代码执行类和方法
若代码为业务代码,则需要具体分析代码,找出代码中死循环或接近死循环的地方,并修正;定位结束;

若堆栈信息为gc线程(类似下图),则需要进行下一步

4.5:dump出java进程的堆对象使用情况
使用jmap -histo > jmap_xxx.txt

找出量比较大的、且跟业务有关的对象,找到这些对象创建的地方进行分析;一般需要持续创建大量的对象,使得内存不够用时,才会频繁触发gc进行回收,gc回收时jvm有停顿,CPU也占用很高。

线程之间的切换,是很耗费性能的,所以带来CPU飙升.
新生代设置过小,也会频繁触发gc。有大对象始终根节点路径可达,无法释放,jvm在疯狂的Full GC。
---------------------

一篇文章:

https://blog.csdn.net/whupanyinghua/article/details/51649819

简单记录下对这个问题的跟踪

首先当然要看下具体是java中哪个线程一直在占用cpu时间哈(说明下, java进程号是 26178)
1.根据java进程ID进行CPU占用排查  ps -mp 26178 -o THREAD,tid,time | sort -rn | more  (sort -rn 以数值的方式进行逆序排列)

2.根据1中查找到的CPU最高的排序中的结果,找出几个占用cpu时间比较高的TID,比如这里的26217 26182 26183
将进程ID转换为16进制,printf "%x\n" 26217

3.再使用jstack命名查询是哪个线程
TID十进制-》十六进制
26217 -》 6669
26182 -》 6646
26183 -》 6647
拿到线程ID的16进制之后,就可以从jstack中查找具体是对应的线程
jstack 26178 |grep 6669 -A 30

可以发现,几个占用大量cpu时间的线程都是GC相关。

(grep -A:

Context control:
-B, --before-context=NUM print NUM lines of leading context
-A, --after-context=NUM print NUM lines of trailing context

找出filename中带有keyword的行,输出中除显示该行外,还显示之后的x行。其中,数字可以变。

-C, --context=NUM print NUM lines of output context

4.再次确认gc信息,查看gc time等信息,jstat -gcutil 26178 1000 100

可以看到s0、s1、eden、old、metaspace都已经爆了,并且FGC次数一直在增加,但是却没有回收到任何空间,导致FGC一直在跑,进入循环,应该是程序存在内存泄露咯。(gc有日志,后续有空再出一篇简单分析gc日志的blog)

5.jmap -histo:live 26178 | more  简单查看对象的大小数目

6.dump内存,使用工具分析内存镜像,jmap -dump:live,format=b,file=problem.bin 26178

7.使用MAT(Memory Analyzer tool)进行数据分析,注意,如果步骤6中dump出来文件过大,需要设置MAT配置文件(MemoryAnalyzer.ini)的xmx参数的大小。
---------------------

java程序 cpu占用过高分析的更多相关文章

  1. 面试问题---JAVA程序CPU占用过高怎么定位

    今天一个电话面试问了这个问题.回来查了下答案,自己也顺带操作一遍,做个记录.之前知道jstack工具可以查看线状态这些.比如死锁这些,主要是之前不知道top -H -p pid这个命令的使用,这命令可 ...

  2. Linux下java进程CPU占用率高分析方法

    Linux下java进程CPU占用率高分析方法 在工作当中,肯定会遇到由代码所导致的高CPU耗用以及内存溢出的情况.这种情况发生时,我们怎么去找出原因并解决. 一般解决方法是通过top命令找出消耗资源 ...

  3. Linux下java进程CPU占用率高分析方法(一)

    Linux下java进程CPU占用率高分析方法 在工作当中,肯定会遇到由代码所导致的高CPU耗用以及内存溢出的情况.这种情况发生时,我们怎么去找出原因并解决. 一般解决方法是通过top命令找出消耗资源 ...

  4. Java程序CPU使用率过高

    Java程序CPU使用率过高 通过top命令找到使用率过高的java进程PID 根据进程号查找线程TID:ps -mp PID -o THREAD,tid,time 将TID转换成16进制:print ...

  5. (转)Linux下java进程CPU占用率高-分析方法

    Linux下java进程CPU占用率高-分析方法 原文:http://itindex.net/detail/47420-linux-java-%E8%BF%9B%E7%A8%8B?utm_source ...

  6. 排查linux下java应用cpu占用过高

    用于快速排查Java的CPU性能问题(top us值过高),自动查出运行的Java进程中消耗CPU多的线程,并打印出其线程栈,从而确定导致性能问题的方法调用.目前只支持Linux.原因是Mac.Win ...

  7. Linux下java进程CPU占用率高-分析方法

    今天登陆同事的一台gateway 开始以为hive环境登陆不了了,仔细一看看了下是因为机器很卡,我每次等几秒没登陆就ctrl+c了,看了下是有个java进程cpu:340.4%  mem:14.6%  ...

  8. 记一次 Java 项目 CPU 占用久高不下故障处理

    事件背景 公司对接了新系统,代码变动很大,项目也很急,于是在上线之后 Zabbix 不时就告警,提示 CPU 使用过载,告警消息类似如下: 一开始以为是系统停机升级,所有人都等着使用系统,导致系统处理 ...

  9. Linux下java进程CPU占用率高分析方法(二)

    1. 通过 top 命令查看当前系统CPU使用情况,定位CPU使用率超过100%的进程ID:2. 通过 ps aux | grep PID 命令进一步确定具体的线程信息:3. 通过 ps -mp pi ...

随机推荐

  1. Hbase内存磁盘大致关系

    转自: https://blog.csdn.net/wuwenxiang91322/article/details/51595771 Hbase内存磁盘关系磁盘数 diskNum磁盘容量 diskCa ...

  2. 实现拖拽列表-微信小程序

    之前在网上搜索拖拽列表的实现时,发现了有好多的方法都是基于像素位置的计算实现的,这种方法要求列表元素的大小以及列表的位置有着非常严格的要求,修改和拓展起来非常的麻烦.于是我自己动手实现了一个基于页面元 ...

  3. 2、Hibernate持久化编写

    一.对于hibernate中的PO编写规则: 1. 必须提供一个无参数的public构造方法   2. 所有属性要private ,对外提供public 的get/set方法   3. 在PO类必须提 ...

  4. C++ getline函数用法详解

    转载自http://c.biancheng.net/view/1345.html 虽然可以使用 cin 和 >> 运算符来输入字符串,但它可能会导致一些需要注意的问题. 当 cin 读取数 ...

  5. .net core 中使用 openssl 公钥私钥进行加解密

    这篇博文分享的是 C#中使用OpenSSL的公钥加密/私钥解密 一文中的解决方法在 .net core 中的改进.之前的博文针对的是 .NET Framework ,加解密用的是 RSACryptoS ...

  6. 敏捷软件开发_实例2<四>

    敏捷软件开发_实例2 上一章中对薪水支付案例的用例和类做了详细的阐述,在本篇会介绍薪水支付案例包的划分和数据库,UI的设计. 包的划分 一个错误包的划分 为什么这个包是错误的: 如果对classifi ...

  7. CSS字体属性

    CSS字体属性 CSS Fonts(字体)属性拥有定义字体系列.大小.粗细和文字样式(如斜体) 字体系列 <style type="text/css"> div{ fo ...

  8. 0基础入门学习Python(第1-2章)

    第一章:就这么愉快的开始吧 1.1获取Python Python3.7 1.2从idle启动 Python 3.7.3 (default, Mar 27 2019, 09:23:39)[Clang 1 ...

  9. Android开发当中的JavaBean实现

    一般我们在Android开发当中如果会对一些数据类进行解析,那么则需要写出一个JavaBean的类,比如在进行json解析的时候,就需要使用这个类进行数据的处理,下面是我们的JavaBean的模板代码 ...

  10. ubuntu下查看本机IP地址

    在终端输入: ifconfig -a 即可得解.出来的结果inet后就是你的ip地址