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

 更新时间:2017年09月30日 09:50:01   作者:流子  
这篇文章主要介绍了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占用过高问题分析及解决方法的全部内容,希望对大家有所帮助,如果有什么疑问,可以随时留言,小编会及时回复大家的。感谢朋友们对脚本之家网站的支持。

相关文章

  • RocketMQ producer发送者浅析

    RocketMQ producer发送者浅析

    RocketMQ生产者是一种高性能、可靠的消息发送者,能够将消息快速、可靠地发送到RocketMQ消息队列中。它具有多种消息发送模式和消息发送方式,可以根据不同的业务需求进行灵活配置
    2023-04-04
  • Java大文件分片上传超详细教程(minio版)

    Java大文件分片上传超详细教程(minio版)

    Minio是一个开源的分布式对象存储系统,它允许用户在存储服务上存储和检索数据,下面这篇文章主要给大家介绍了关于Java大文件分片上传(minio版)的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-08-08
  • IDEA 自动跳出括号的快捷键分享

    IDEA 自动跳出括号的快捷键分享

    这篇文章主要介绍了IDEA 自动跳出括号的快捷键分享,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-02-02
  • Java日常练习题,每天进步一点点(43)

    Java日常练习题,每天进步一点点(43)

    下面小编就为大家带来一篇Java基础的几道练习题(分享)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧,希望可以帮到你
    2021-07-07
  • Java装饰者模式实例详解

    Java装饰者模式实例详解

    这篇文章主要介绍了Java装饰者模式,结合实例形式详细分析了装饰着模式的原理与java具体实现技巧,需要的朋友可以参考下
    2017-09-09
  • IDEA如何查看代码反汇编代码

    IDEA如何查看代码反汇编代码

    这篇文章主要介绍了IDEA如何查看代码反汇编代码问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-11-11
  • java中spi使用详解

    java中spi使用详解

    java中spi(service provider interface)是jdk内置的一种服务发现机制,可以基于配置,在运行时加载指定服务。这篇文章主要介绍了java中spi使用,需要的朋友可以参考下
    2020-09-09
  • java设计模式之单例模式学习

    java设计模式之单例模式学习

    单例对象(Singleton)是一种常用的设计模式。在Java应用中,单例对象能保证在一个JVM中,该对象只有一个实例存在
    2014-01-01
  • Java匹配正则表达式汇总

    Java匹配正则表达式汇总

    java匹配字符串表达式在我们数据处理方面是及其重要的,现在就把我这几天数据处理比较常用的向大家介绍一下,常规的一些匹配方式就不介绍了,我们来学习一些特殊的,感兴趣的朋友跟随小编一起看看吧
    2023-03-03
  • Java ArrayDeque使用方法详解

    Java ArrayDeque使用方法详解

    这篇文章主要为大家详细介绍了Java ArrayDeque的使用方法,感兴趣的小伙伴们可以参考一下
    2016-03-03

最新评论