`
anysky131
  • 浏览: 176621 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

如何處理Java應用在CPU高時的問題排查與解決

    博客分类:
  • Java
 
阅读更多

如何處理Java應用在CPU高時的問題排查與解決


在Tomcat的應用下,出現Java進程佔用非常高的CPU,而內存卻佔用很少時,就需要考慮是否程序中有線程死鎖的情況出現,造成了CPU資源無法釋放;這時就要通過對CPU的線程及進程進行分析來找到問題的原因;
查找與定位問題通常分爲以下幾步:
1. 確定當前Java的進程ID
ps -ef|grep java得到當前運行的java進程的PID;
如得到的ID爲10000
2.找到Java線程後,需要再定位實際在CPU中運行的線程情況,我們知識進程是表明一個程序,而線程是程序中實際在CPU中進行時間片的運算,因此我們需要定位到實際的線程情況:
方法一:ps -mp 10000 -o THREAD,tid,time | sort -rn
顯示結果如:
USER     %CPU PRI SCNT WCHAN  USER SYSTEM   TID     TIME
root     98.5  19    - -         -      -  10001 00:35:48
root     90.1  19    - -         -      -  10102 00:20:16
...
方法二:top -Hp 10000 -d 1 -n 3
顯示結果如:
top - 23:37:41 up  1:17,  4 users,  load average: 0.09, 0.08, 0.12
Threads:   7 total,   0 running,   7 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.5 us,  0.0 sy,  0.0 ni, 99.5 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem:   3750588 total,  2459188 used,  1291400 free,   126660 buffers
KiB Swap:        0 total,        0 used,        0 free,  1361336 cached


  PID USER      PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+ COMMAND     
12571 kevin     20   0 1167372  98148  31888 S  2.0  2.6   0:07.13 chrome      
12575 kevin     20   0 1167372  98148  31888 S  0.0  2.6   0:00.60 Chrome_Chi+ 
12576 kevin     20   0 1167372  98148  31888 S  0.0  2.6   0:00.00 VC manager  
12577 kevin     20   0 1167372  98148  31888 S  0.0  2.6   0:00.00 HTMLParser+ 
12578 kevin     20   0 1167372  98148  31888 S  0.0  2.6   0:00.00 Media       
12591 kevin     20   0 1167372  98148  31888 S  0.0  2.6   0:00.00 FFmpegDemu+ 
12593 kevin     20   0 1167372  98148  31888 S  0.0  2.6   0:00.02 AudioOutpu+ 
它會列出此進程下所有的線程數,線程數即爲TID,裏面標注出了每個線程佔用CPU的資源數和佔用的時間,根據此結果我們發現這兩個線程是有問題的;
接下來我們要根據線程找到實際在CPU中運行的程序堆棧;
3.有了線程ID:10001,10002,我們需要首先將其轉換爲十六進制:
printf "%x\n" 10001
輸出:2711
printf "%x\n" 10101
輸出:2776

十六進制的線程地址有了;
4. 我們需要拿到當前線程的堆棧信息,我們有兩種方法獲取它的堆棧信息:

4.1 kill -3 10000 完了去日誌中找到輸出的信息,然後 拿着線程ID:10001,10101的十六進制去日誌中定位;
4.2 對於java程序還可以使用它的debug工具:jstack 10000|grep 2711 -A 30打印出包含此地址的線程堆棧,從而找到Java程序中哪些代碼一直在CPU中佔着資源不釋放;
打印出的堆棧信息如:

见附件图

  • 大小: 163.3 KB
分享到:
评论

相关推荐

    java进程占用CPU和内存太高问题排查相关测试文件.zip

    在Java应用程序的运行过程中,有时会遇到进程占用CPU和内存过高导致系统性能下降的问题。针对这类问题,开发者需要进行深入的排查与优化。本压缩包文件包含了一些关键工具和输出,帮助我们理解如何进行这样的排查。 ...

    shell脚本自动监测系统cpu资源,异常彪高时,自动打印应用线程日志文件

    总的来说,这个shell脚本解决方案提供了一种自动化的方法来监控CPU资源,并在必要时进行问题排查,对于保障服务稳定性和优化系统性能具有重要意义。通过熟练掌握shell脚本,IT从业者可以构建更多实用的自动化工具,...

    show-busy-java-threads-jvm-cpu.rar

    开发者可以通过这个脚本,结合日志和代码分析,快速定位并解决问题,提高Java应用的性能和稳定性。在日常开发和维护工作中,理解并熟练运用这样的工具是非常必要的,它能有效提升故障排查的效率。

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

    1. **CPU占用过高问题排查**:当遇到Java应用(如Tomcat)CPU占用过高时,通常会使用`jps`找到JVM进程,`jstack`分析线程状态,`jstat`监控JVM内存和垃圾收集情况。 2. **log4j死锁问题**:log4j 1.x版本可能存在...

    tomcat cpu high

    10. **硬件升级**:如果上述优化都无法解决问题,可能需要考虑升级服务器硬件,如增加CPU核心数或提升CPU频率。 解决"Tomcat CPU高"的问题需要综合分析,可能涉及代码优化、配置调整、系统监控等多个方面。在排查...

    线上排查思路,一些关于服务器排查的命令与案例

    服务器排查思路是指在服务器出现问题时,通过一系列的排查步骤和命令来定位和解决问题的过程。下面将针对磁盘不足、CPU 过高和 Tomcat假死三种常见的问题进行排查思路和命令案例的讲解。 1. 磁盘不足 当磁盘不足时...

    动态显示CPU利用率

    总之,动态显示CPU利用率是一个强大的工具,它能够帮助我们实时了解系统的运行状态,及时发现并解决问题,提高系统的稳定性和效率。无论你是开发者、系统管理员还是运维人员,理解并掌握这一技能都是提升工作效率的...

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

    当Java应用的CPU占用率飙高时,可能导致系统响应变慢甚至无法正常处理新请求。以下是一些分析步骤: 1. **模拟问题**:首先,我们可以编写一个包含死循环的Java程序,使CPU使用率上升。 2. **观察CPU占用**:在...

    jca-V4.5.7.zip

    在Java应用开发中,"Thread Dump"是一种诊断工具...理解Thread Dump并熟练运用是Java性能调优的关键技能之一,对于排查和解决问题具有重要作用。同时,对JCA的理解有助于在企业级应用开发中实现高效的数据交互和集成。

    线上故障排查全套路,总有一款适合你1

    理解这些工具的用途和分析方法,能帮助快速定位和解决问题,确保系统的正常运行。在排查过程中,应从CPU、内存、网络、磁盘等角度全面考虑,确保所有可能的原因都得到检查,从而有效提高故障解决效率。

    JConsole工具使用

    在某些复杂场景下,结合源码分析,JConsole能帮助我们定位和解决问题,提升应用程序的稳定性和性能。 总的来说,JConsole是Java开发和运维过程中不可或缺的工具之一,它的强大功能使得我们可以实时监控和调试应用...

    大型项目性能测试监控分析流程.docx

    8. **问题排查与优化**: 根据测试结果,对应用程序或数据库进行优化,如调整SQL语句、优化代码或增加系统资源。 这个流程提供了一套完整的性能测试操作指南,不仅适用于新手学习,也为团队协作提供了标准化流程,...

    阿里P7面试题整理集合

    - **性能监控**:当CPU或内存使用过高时,如何排查问题。 - **逃逸分析**:用于识别对象是否可能逃逸到堆,对栈分配和编译优化有直接影响。 4. **Redis**: - **数据结构**:如哈希、列表、集合、有序集合等。 ...

    SystemInformation-all

    内存是临时存储和处理数据的地方,高内存使用率通常与多任务处理和大型应用程序运行有关。如果内存不足,系统会使用硬盘上的虚拟内存,这将显著降低系统性能。"SystemInformation-all"能够提供内存使用情况的详细...

    Java线程错误捕获工具 CheckThread源码

    - CPU和内存使用率监控:为了提高性能,CheckThread可能监控线程的CPU和内存使用,以便在资源消耗过高时采取措施。 5. **日志记录** - 为了调试和问题排查,CheckThread可能会集成常见的日志框架,如Log4j或SLF4J...

    压测之道-详说压测的那些事情.pdf

    压测环境的选择也很关键,通常测试环境用于初步排查问题,预发布环境和正式环境则用于更接近实际的压测,特别是正式环境压测应选择在非高峰期进行,以免影响线上服务。 在压测过程中,wrk的参数设置尤为重要。线程...

    JMXHub-开源

    例如,当CPU使用率过高时,JMXHub可以及时发出警报,帮助快速定位和解决问题。 JMXHub的开源特性使其具有高度的社区支持和持续的更新。开源社区的贡献者们不断改进代码,修复已知问题,并添加新的功能。这意味着...

    sentinel 控制台安装包

    8. **可视化展示**:以图表形式展示系统的流量、异常、资源状态等信息,便于问题排查和性能优化。 9. **API 文档**:提供了 API 文档,帮助开发者了解如何与 Sentinel 控制台进行交互,如客户端如何接入、如何配置...

    开发一个简易的任务监控程序 进程守卫

    进程守卫是一种机制,它的主要职责是监视特定进程的状态,当这些进程出现问题,如意外退出或资源消耗过高时,进程守卫会采取相应措施,如自动重启进程或发送警报。这种机制对于保持服务的高可用性和稳定性具有重要...

Global site tag (gtag.js) - Google Analytics