java应用cpu占用过高问题分析及解决方法

使用jstack分析java程序cpu占用率过高的问题

1,使用jps查找出java进程的pid,如3707

2,使用top -p 14292 -H观察该进程中所有线程的CPU占用。

[root@cp01-game-dudai-0100.cp01.baidu.com ~]# top -p 14292 -H
top - 22:14:13 up 33 days, 7:29, 4 users, load average: 25.68, 32.11, 33.76
Tasks: 113 total,  2 running, 111 sleeping,  0 stopped,  0 zombie
Cpu(s): 68.3%us, 6.3%sy, 0.0%ni, 20.2%id, 0.1%wa, 0.2%hi, 4.9%si, 0.0%st
Mem: 65965312k total, 65451232k used,  514080k free,  82164k buffers
Swap:  975864k total,  972052k used,   3812k free, 9714400k cached
 PID USER   PR NI VIRT RES SHR S %CPU %MEM  TIME+ COMMAND
15844 root   15  0 6889m 5.7g 4864 S 20.6 9.1 814:13.29 java
15848 root   15  0 6889m 5.7g 4864 S 13.0 9.1 460:25.17 java
15611 root   15  0 6889m 5.7g 4864 S 12.7 9.1 468:17.77 java
15613 root   15  0 6889m 5.7g 4864 S 11.7 9.1 479:40.45 java
15743 root   15  0 6889m 5.7g 4864 S 11.7 9.1 443:04.80 java
15612 root   15  0 6889m 5.7g 4864 S 11.0 9.1 453:43.68 java
15965 root   15  0 6889m 5.7g 4864 S 10.3 9.1 371:00.33 java
15490 root   15  0 6889m 5.7g 4864 S 7.7 9.1 255:32.74 java
15587 root   15  0 6889m 5.7g 4864 S 7.3 9.1 282:27.58 java
15590 root   15  0 6889m 5.7g 4864 S 7.3 9.1 205:48.37 java
15491 root   15  0 6889m 5.7g 4864 R 6.3 9.1 279:09.08 java
15689 root   15  0 6889m 5.7g 4864 S 5.7 9.1 251:42.36 java
16935 root   15  0 6889m 5.7g 4864 S 5.7 9.1 190:34.37 java
15665 root   15  0 6889m 5.7g 4864 S 5.3 9.1 250:07.34 java
16920 root   15  0 6889m 5.7g 4864 S 5.3 9.1 241:34.50 java
15671 root   15  0 6889m 5.7g 4864 S 5.0 9.1 239:49.97 java
15492 root   15  0 6889m 5.7g 4864 S 4.7 9.1 210:23.09 java
14322 root   16  0 6889m 5.7g 4864 S 4.3 9.1 107:39.61 java
14316 root   16  0 6889m 5.7g 4864 S 4.0 9.1 107:18.43 java
14317 root   16  0 6889m 5.7g 4864 S 4.0 9.1 107:29.13 java
15591 root   15  0 6889m 5.7g 4864 S 4.0 9.1 114:34.90 java
14313 root   16  0 6889m 5.7g 4864 S 3.7 9.1 107:12.70 java
14314 root   15  0 6889m 5.7g 4864 S 3.7 9.1 107:28.05 java
14319 root   16  0 6889m 5.7g 4864 S 3.7 9.1 107:27.43 java
14321 root   15  0 6889m 5.7g 4864 S 3.3 9.1 108:01.12 java
15589 root   15  0 6889m 5.7g 4864 R 3.0 9.1 109:01.91 java
15615 root   15  0 6889m 5.7g 4864 S 3.0 9.1 114:55.29 java
16808 root   15  0 6889m 5.7g 4864 S 2.7 9.1 279:05.03 java
14315 root   15  0 6889m 5.7g 4864 S 2.0 9.1 107:45.00 java
14320 root   15  0 6889m 5.7g 4864 S 2.0 9.1 107:48.30 java
15489 root   15  0 6889m 5.7g 4864 S 1.7 9.1 57:38.46 java
15670 root   15  0 6889m 5.7g 4864 S 1.3 9.1  5:55.43 java
14318 root   15  0 6889m 5.7g 4864 S 0.7 9.1 107:45.88 java
14826 root   15  0 6889m 5.7g 4864 S 0.7 9.1 25:07.64 java

3,找出CPU消耗较多的线程id,如15844,将15844转换为16进制0x3de4,注意是小写哦

4,使用jstack 14292|grep -A 10 0x3de4来查询出具体的线程状态。

[root@cp01-game-dudai-0100.cp01.baidu.com ~]# jstack 14292|grep -A 10 0x3de4
"pool-52-thread-1" prio=10 tid=0x000000005a08e000 nid=0x3de4 waiting on condition [0x00002ae63d917000]
  java.lang.Thread.State: WAITING (parking)
    at sun.misc.Unsafe.park(Native Method)
    - parking to wait for <0x00000006f9a0a110> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
    at java.util.concurrent.locks.LockSupport.park(LockSupport.java:156)
    at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:1987)
    at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:399)
    at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:947)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:907)
    at java.lang.Thread.run(Thread.java:662) 

通过这些线程状态便可基本定位问题之所在。

解决办法:

方法1

1.jps 获取Java进程的PID。

2.jstack pid >> java.txt 导出CPU占用高进程的线程栈。

3.top -H -p PID 查看对应进程的哪个线程占用CPU过高。

4.echo “obase=16; PID” | bc 将线程的PID转换为16进制,大写转换为小写。

5.在第二步导出的Java.txt中查找转换成为16进制的线程PID。找到对应的线程栈。

6.分析负载高的线程栈都是什么业务操作。优化程序并处理问题。

方法2

1.使用top 定位到占用CPU高的进程PID

top

通过ps aux | grep PID命令

2.获取线程信息,并找到占用CPU高的线程

ps -mp pid -o THREAD,tid,time | sort -rn

3.将需要的线程ID转换为16进制格式

printf "%x\n" tid

4.打印线程的堆栈信息

jstack pid |grep tid -A 30

总结

以上就是本文关于java应用cpu占用过高问题分析及解决方法的全部内容,希望对大家有所帮助,如果有什么疑问,可以随时留言,小编会及时回复大家的。感谢朋友们对我们网站的支持。

(0)

相关推荐

  • 聊聊Java和CPU的关系

    其实写Java的人貌似和CPU没啥关系,最多最多和我们在前面提及到的如何将CPU跑满.如何设置线程数有点关系,但是那个算法只是一个参考,很多场景不同需要采取实际的手段来解决才可以:而且将CPU跑满后我们还会考虑如何让CPU不是那么满,呵呵,人类,就是这么XX,呵呵,好了,本文要说的是其他的一些东西,也许你在java的写代码时几乎不用关注CPU,因为满足业务才是第一重要的事情,如果你要做到框架级别,为框架提供很多共享数据缓存之类的东西,中间必然存在很多数据的征用问题,当然java提供了很多conc

  • Linux中使用Shell脚本查看Java线程的CPU使用情况

    线上Java应用,在业务高峰期的时候经常出现CPU跑高,需要查看实时的线程占用cpu情况,下面是一个很好用的脚本,可以快速导出每个线程的占用CPU情况,结合jstack日志,排查到具体的线程类名. 一.首先获得jvm的进程ID: 复制代码 代码如下: ps -ef|grep javatomcat     374   372  1 11:45 ?        00:02:30 jsvc.exec -java-home /usr/java/latest -user tomcat -pidfile

  • java应用cpu占用过高问题分析及解决方法

    使用jstack分析java程序cpu占用率过高的问题 1,使用jps查找出java进程的pid,如3707 2,使用top -p 14292 -H观察该进程中所有线程的CPU占用. [root@cp01-game-dudai-0100.cp01.baidu.com ~]# top -p 14292 -H top - 22:14:13 up 33 days, 7:29, 4 users, load average: 25.68, 32.11, 33.76 Tasks: 113 total, 2

  • java实战CPU占用过高问题的排查及解决

    最近一段时间 某台服务器上的一个应用总是隔一段时间就自己挂掉 用top看了看 从重新部署应用开始没有多长时间CPU占用上升得很快 排查步骤 1.使用top 定位到占用CPU高的进程PID top 2.通过ps aux | grep PID命令 获取线程信息,并找到占用CPU高的线程 ps -mp pid -o THREAD,tid,time | sort -rn 3.将需要的线程ID转换为16进制格式 printf "%x\n" tid 4.打印线程的堆栈信息 到了这一步具体看堆栈的日

  • Java进程cpu占用过高问题解决

    cpu是时分(time division)的,操作系统里有很多线程,每个线程的运行时间由cpu决定,cpu会分给每个线程一个时间片,时间片是一个很短的时间长度,如果在时间片内,线程一直占有,则是100%:我们应该意识到,cpu运行速度很快(主频非常高),除非密集型耗费cpu的运算,其它类型任务都会在小于时间片的时间内结束. 产生CPU100%的原因: 某一程序一直占用CPU是导致CPU100%的原因,大概有以下几种情况: 1.Java 内存不够或溢出导致GC overhead问题, GC ove

  • mysqlreport显示Com_中change_db占用比例高的问题的解决方法

    首先说明一点,每天的访问量并不大每天才2W的访问量,按道理说,访问量再增加一倍这样的服务器也应该足以承受.可是我们的服务器为什么总是这样频频重启呢?经过mysqlreport显示mysql运行的状态如下:MySQL 5.1.28-rc-log uptime 0 0:4:48 Thu Apr 30 14:04:58 2009 __ Key _________________________________________________________________Buffer used 7.7

  • JVM---jstack分析Java线程CPU占用,线程死锁的解决

    本文章主要演示在Windows环境,Linux环境也差不多. 一.分析CPU占用飙高 首先写一个Java程序,并模拟一个死循环.让CPU使用率飙高.CPU负载过大的话,新的请求就处理不了了,这就是很多程序变慢了甚至不能访问的原因之一. 下面是我这里的Controller,启动程序之后,开多个请求访问这个方法.死循环代码就不贴了,自己构造.我这里模拟的一个截取字符串的死循环. /** * 演示死循环导致cpu使用率飙高 * */ @RequestMapping("/loop") publ

  • 记一次tomcat进程cpu占用过高的问题排查记录

    本文主要记录一次tomcat进程,因TCP连接过多导致CPU占用过高的问题排查记录. 问题描述 linux系统下,一个tomcat web服务的cpu占用率非常高,top显示结果超过200%.请求无法响应.反复重启依然同一个现象. 问题排查 1.获取进程信息 通过jdk提供的jps命令可以快速查出jvm进程, jps pid 2.查看jstack信息 jstack pid 发现存在大量log4j线程block,处于waiting lock状态 org.apache.log4j.Category.

  • php-fpm 占用CPU过高,100%的解决方法

    话说最近配置的LNMP还算稳定,正在暗自窃喜,但是从昨晚开始,就发现服务器的CPU占用过高,甚至到了100%.我的内存是1G的,正常情况下占用率应该在5%以下,最多不超10%. 阿里云最近的监控显示: 使用top命令查看,发现 php-fpm 占用内存过高,非常不正常: 我按照<Nginx使用的php-fpm的两种进程管理方式及优化>这篇文章,配置 php-fpm 进程数如下: 重启 php-fpm 后,还是没有彻底解决问题,依旧会出现占用 99以上,不知道哪位朋友知道如何分析和解决呢?小弟求

  • arthas排查jvm中CPU占用过高问题解决

    目录 安装 小试 找出CPU的元凶 查看线程栈的参数 安装 小试 记一次使用arthas排查jvm中CPU占用过高问题.这工具屌爆了 碾压我目前使用的全部JVM工具. curl -O https://arthas.aliyun.com/arthas-boot.jar java -jar arthas-boot.jar --repo-mirror aliyun --use-http jar后面的参数也可以不加 加上只是为了下载速度更快 接下来arthas 控制台中显示了当前机器上jvm进程列表 输

  • idea对CPU的占用率过大问题的解决方法

    背景:昨晚有一次敲完代码运行完程序后,idea非常卡顿,连输入代码都不能进行,因为有点晚并且累了,所有就关了电脑,今天早上再次打开idea,还是一样卡顿,因为idea的试用期明天就到期了,所有就先破解了idea,破解完之后,还是非常流畅的,但是一运行程序就拉胯了,就先百度看一下解决方案,以下几个解决方案试了,基本问题还是没有解决,就在群里问了几个大佬,方案不是重装系统就是换电脑,同时开始了电脑的配置讨论,重装系统和换电脑的什么是不可能的,所有只有自己慢慢摸索了. 1 修改idea配置文件安装目录

  • Android Force Close 出现的异常原因分析及解决方法

    一.原因: forceclose,意为强行关闭,当前应用程序发生了冲突. NullPointExection(空指针),IndexOutOfBoundsException(下标越界),就连Android API使用的顺序错误也可能导致(比如setContentView()之前进行了findViewById()操作)等等一系列未捕获异常 二.如何避免 如何避免弹出Force Close窗口 ,可以实现Thread.UncaughtExceptionHandler接口的uncaughtExcepti

随机推荐