zoukankan      html  css  js  c++  java
  • java程序——CPU过高100%及内存泄露排查

    CPU过高

    这类问题可以使用 top 命令观察一些,CPU 是不是都被 Java 程序占用了。比如下面这个截图:

    服务器的 CPU 大多都被 Java 占用了。这正是我们之前生产上 CPU 过高的一个截图。

    服务其CPU 还能超过 100%原因

    在 Linux 上,多核 CPU 就会超过 100%。top 命令显示的是你的程序占用的 cpu 的总数,也就是说如果你是 4 核 cpu 那么 cpu 最高占用率可达 400%,top 里显示的是把所有使用率加起来。

    CPU 过高,这说明程序在进行计算密集型的操作,或者是线程死锁,创建的线程过多等情况引起的。具体来说有哪些操作会导致 Java CPU 过高呢?

    我总结了一下,一般有下面几种情况发生

    1.java 正则表达式使用不不当或者造成回溯导致CPU 100%
    2.java线程死锁,程序hang住
    3.程序死循环,跳不出循环
    4.不靠谱的算法

    CPU过高排查

    按照下面几个步骤执行即可

    步骤一:

    使用 top 命令,查看占用 CPU 最高的进程。

    Linux 系统,输入 top 命令后,在输入大写 P,将以 CPU 占用率大小的顺序排列进程列表。

    步骤二:

    在执行“top -Hp 进程PID”命令。进程PID 是上一步 top 命令找出来的。

    例如:执行

    top -Hp 28174 -d 1 -n 1

    命令,查出占 CPU 最高的线程。

    发现 20766 是最耗 CPU 的线程,转换成 16 进制是 511e,再用 jstack 命令查看线程堆栈。

    步骤三:

    线程 ID 转化,可以使用 printf “0x%x ” 20766 命令。

    步骤四:

    然后再执行

    jstack -l 20765 | grep 511e -A 20
    

    命令,查看线程堆栈信息。

    内存泄漏

    内存泄露一般都是 HashMap,ArrayList,或者数据流没被关闭,再者就是一些方法使用不当,漏洞等产生的内存泄露。比如 Jdk 1.6 中的 substring 等。

    内存泄漏排查

    泄漏排查过程如下

    步骤一:

    使用 jstat -gc pid 命令查看了 java 进程的 GC 状态。如果在频繁的发生 GC,那么你的程序肯定有问题。

    例如下面的 Full Gc 一秒发生一次。

     步骤二:

    需要保存了线程栈的现场和保存堆快照

    //保存了线程栈的现场
    jstack pid > jstack.log 
    
    //保存堆快照
    jmap -dump:format=b,file=heap.log pid 

    再然后重启服务,先让程序恢复可用。

    步骤三:

    再接下来看看线程是否正常,可以执行以下命令:

    grep 'java.lang.Thread.State' jstack.log  | wc -l
    或者
    grep -A 1 'java.lang.Thread.State' jstack.log  | grep -v 'java.lang.Thread.State' | sort | uniq -c |sort -n

    看不出来也没关系,使用 MAT 分析 jvm heap。知道你找到占用内存最大的对象,查看具体的代码,解决问题,发布版本,更新程序。

  • 相关阅读:
    关于DOM节点的逆序
    javascript 巧妙的数组去重
    Canvas 学习笔记1
    web前端开发规范
    关于使用new和不使用new
    先知JS分享第二讲 数据类型与操作符
    关于谷歌console的小技巧
    菜鸟读jQuery 2.0.3 源码分析系列(2)
    菜鸟读jQuery 2.0.3 源码分析系列(1)
    local npm module ("*****") not found
  • 原文地址:https://www.cnblogs.com/yyy-blog/p/10312922.html
Copyright © 2011-2022 走看看