• 技术文章 >Java >java教程

    Java进程CPU占用率100%问题排查的方法

    不言不言2019-03-19 10:29:19转载2470
    本篇文章给大家带来的内容是关于Java进程CPU占用率100%问题排查的方法,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。

    100%指的是占用了CPU一个核心,两个核心是200%,以此类推。
    CPU占用率及对应进程ID(pid)可以通过top命令确定,在top界面按 c (显示完整的命令行参数),按 1 (显示每个核心的统计数据)。(推荐:Java教程

    这个问题最常见的有以下几种可能:

    1、堆内存不足导致频繁Full GC
    可以通过两个命令确定

    sudo jmap -heap pid 查看堆内存的消耗情况

    sudo jstat -gc pid interval count 查看GC情况,示例:sudo jstat -gc 5746 3000 5 代表查看5746进程的GC情况、每隔3000毫秒打印一次、总共打印5次。如果FGC/FGCT增长明显,说明Full GC很频繁。

    后续处理:

    如果情况紧急,那得马上重启Java应用进程不紧急的话需要获取相关信息用于分析为什么堆内存被消耗完了,可能有内存泄漏问题,可以用 1)sudo jmap -histo pid | head -n 20 查看Java对象的占用统计信息,2)sudo jmap -dump:live,format=b,file=heap.bin pid 把堆转储导出到本地文件,可以用 Eclipse MAT 工具分析内存泄漏

    2、代码实现问题

    思路:追查具体是哪个线程占用了CPU,1)先查到本地系统CPU占用率高的线程ID,2)找到对应的Java线程及线程堆栈

    top -H -p pid 查看某个进程里面哪些线程占用了CPU,把对应的线程ID拷贝下来,转为十六进制【IDEA》Tools》Groovy Console》println Long.toHexString(1234) 即可完成转换】。

    sudo jstack -l -F pid | less 获取Java线程堆栈,用十六进制的本地线程ID搜索,会在某一行的nid处找到对应的线程。查看Java线程堆栈,找到对应的Java类及行号,然后阅读代码查找可能的问题原因。

    jstack堆栈信息里tid/nid的说明
    https://docs.oracle.com/javas...

    The thread dump consists of the thread stack, including the thread state, for all Java threads in the virtual machine.
    
    The header line contains the following information about the thread:
    - Thread ID (tid), which is the address of a thread structure in memory.
    - ID of the native thread (nid).

    以上就是Java进程CPU占用率100%问题排查的方法的详细内容,更多请关注php中文网其它相关文章!

    声明:本文转载于:segmentfault,如有侵犯,请联系admin@php.cn删除
    专题推荐:debug java
    上一篇:java环境的配置及安装(图文) 下一篇:怎么使用JVM捕获Java异常?(附示例)
    大前端线上培训班

    相关文章推荐

    • 输出java进程的jstack信息示例分享 通过线程堆栈信息分析java线程• Java如何获取当前进程ID以及所有Java进程的进程ID• java进程用法汇总• 如何利用JDK自带jmap和jhat监控运行状态的Java进程• Java进程批量启动停止的方法介绍(附示例)

    全部评论我要评论

  • 取消发布评论发送
  • 1/1

    PHP中文网