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. 【TCP/IP网络编程】:02套接字类型与协议设置

    本篇文章主要介绍创建套接字函数相关的3个输入参数的含义,它们最终确定了套接字通信所采用的协议.同时,也简单对比了TCP和UDP传输方式的区别. 什么是协议?协议是对话中使用的通信规则,而在计算机领域则 ...

  2. CentOS7下rsync服务端与Windows下cwRsync客户端实现数据同步配置方法

    最近需求想定期备份服务器d盘的数据到Linux服务器上面,做个笔记顺便写下遇到的问题 以前整过一个win下的cwrsync(客户端)+rsync(服务端:存储)的bat脚本 和整过一个Linux下的r ...

  3. JDBC进阶 元数据

    1:resultSet 1.1最基本的ResultSet. 1.2 可滚动的ResultSet类型 1.3 可更新的ResultSet 1.4 可保持的ResultSet 2:PrepareState ...

  4. mysql常用命令杂记

    查看版本 mysqladmin -uRootmaster -pRootmaster@777 versionselect version() 查看Log_bin是否开启 show variables l ...

  5. 人生苦短?试试Groovy进行单元测试

    如果您今天正在编程,那么您很可能听说过单元测试或测试驱动的开发过程.我还没有遇到一个既没有听说过又没有听说过单元测试并不重要的程序员.在随意的讨论中,大多数程序员似乎认为单元测试非常重要. 但是,当我 ...

  6. Idea-搜索快捷键

    1.Ctrl+N按名字搜索类 相当于eclipse的ctrl+shift+R,输入类名可以定位到这个类文件,就像idea在其它的搜索部分的表现一样,搜索类名也能对你所要搜索的内容多个部分进行匹配,而且 ...

  7. git报错:failed to push some refs to 'git@github.com:JiangXiaoLiang1988/CustomerHandl

    一.错误信息 今天在使用git将代码上传到GitHub的时候报下面的错误: 以前上传代码的时候重来没有出现这种错误,在网上查找了半天终于找到原因了:github中的README.md文件不在本地代码目 ...

  8. Python里三个最高逼格的调试神器

    调试是开发过程中不可避免的一个环节,在Python中我们使用print.logging.assert等方法进行调试既简单又实用,但毕竟有其局限性.今天这篇文章为大家带来三个工具,其中有Python的内 ...

  9. Python爬虫使用selenium爬取qq群的成员信息(全自动实现自动登陆)

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者: python小爬虫 PS:如有需要Python学习资料的小伙伴可以 ...

  10. idea的service注入mapper报错

    一.问题 idea的java项目中,service类中注入mapper报错 二.解决 方法1 在mapper类上加上  @Repository 注解即可,当然不加也行,程序也不回报错,是idea的误报 ...