CPU过高

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

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

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

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

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

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

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

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\n” 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 'java.lang.Thread.State' jstack.log | grep -v 'java.lang.Thread.State' | sort | uniq -c |sort -n

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

java程序——CPU过高100%及内存泄露排查的更多相关文章

  1. jstack命令定位java程序CPU利用率高的代码位置

    高手是怎么使用jstack精确找到异常代码的(java程序CPU利用率高的情况) 请jstack神器来帮忙 本文介绍Linux环境下使用jstack定位问题的秘笈1.[top命令]找到CPU利用率持续 ...

  2. jstack定位java程序CPU使用高问题

    top top -Hp 进程id printf "0x%x\n" 2769746 jstack 进程id [root ~]$ printf "0x%x\n" 2 ...

  3. Java程序CPU使用率过高

    Java程序CPU使用率过高 通过top命令找到使用率过高的java进程PID 根据进程号查找线程TID:ps -mp PID -o THREAD,tid,time 将TID转换成16进制:print ...

  4. jstack来分析。当linux出现cpu被java程序消耗过高时

    我们使用jdk自带的jstack来分析.当linux出现cpu被java程序消耗过高时,以下过程说不定可以帮上你的忙: 1.top查找出哪个进程消耗的cpu高 21125 co_ad2    18   ...

  5. 【三板斧】Java定位CPU使用高问题

    [三板斧]Java定位CPU使用高问题 1.TOP命令,查询消耗CPU高的进程号 PID,并记录下来,按下键盘"H"键,记录高消耗线程号,并将改线程号转换为十六进制 2.使用 js ...

  6. Java进程CPU使用率高排查

    Java进程CPU使用率高排查 生产java应用,CPU使用率一直很高,经常达到100%,通过以下步骤完美解决,分享一下.1.jps 获取Java进程的PID.2.jstack pid >> ...

  7. C# Winform程序CPU占用高的原因和解决方法

    程序CPU占用高的可能原因: 1.存在死循环: 为什么死循环会导致CPU占用高呢?      虽然分时操作系统是采用时间片的机制对CPU的时间进行管理的,也就是说到了一定时间它会自动从一个进程切换到下 ...

  8. MySql CPU彪高到百分之1000的排查思路

    You need to enable JavaScript to run this app.   原文内容来自于LZ(楼主)的印象笔记,如出现排版异常或图片丢失等情况,可查看当前链接:https:// ...

  9. 【面试普通人VS高手系列】CPU飙高系统反应慢怎么排查?

    面试过程中,场景类的问题更容易检测出一个开发人员的基本能力. 这不,一个小伙伴去阿里面试,第一面就遇到了关于"CPU飙高系统反应慢怎么排查"的问题? 对于这个问题,我们来看看普通人 ...

随机推荐

  1. 创建一个apk:按钮-click-文字display,测试apk;安装在真机进行调试的方法

    问题引入: 怎么样在一个app做event事件?例如touch操作,滑动操作,和按键事件(back,home等) 回答1:device.touch(x,y) ---获取device对象,然后touch ...

  2. 微信支付完成 vue 页面不跳转问题

    遇到的问题是 vue 调用微信支付 回调成功以后,页面路由不跳转. 解决的办法是用window.location.href /** * @method 支付费用方法 * @param data:后台返 ...

  3. (53)C# 工具

    https://docs.microsoft.com/zh-cn/dotnet/framework/tools/ildasm-exe-il-disassembler 一.Visual Studio的开 ...

  4. 无法将 Ethernet0 连接到虚拟网络”VMnet0″ 详细信息可以在 vmware.log 文件中找到未能连接虚拟机Ethernet0

    在 vmware“编辑->虚拟网络设置”里面,点“恢复默认”可解决.  

  5. JS基础复习

      js基础语法     Netcape        js基础语法规范(ECMAScript1,2,3,3.1,5(IE9),6   ES    ES6=es2015) DOM BOM       ...

  6. html01. <!DOCTYPE html>

    解释 在HTML文档初,往往会有这么一句话<!DOCTYPE html>,它是html5标准网页声明,全称为Document Type HyperText Mark-up Language ...

  7. DLL 调用 对话框 以及 如何获取调用dll 应用程序(窗口程序)的窗口句柄

    1.一般创建需要的窗口,转换成相应的窗口类: 声明一个导出函数,来处理窗口的显示,如: CTest test; extern "C" __declspec(dllexport) v ...

  8. Ubuntu12.04下删除文件夹内所有的.svn文件

    前段时间在公司里遇到一个问题,从svn上下载下来的文件含有.svn文件,如何删除当前目录下的所有.svn文件呢? 一个个手动删除显然不可能,太多了.其实在Ubuntu12.04下延伸至其他所搜的Lin ...

  9. vue中记录页面的滚动距离

    业务需求:pageOne页面是一个商品列表页面,在这个页面点击商品,就会跳转到pageTwo商品详细页面.此时再从pageTwo页面返回到pageOne页面时,pageOne页面需要做到:1.记录pa ...

  10. VScode Python no module的解决方法

    在lauch.json中,修改 "env": {}为 "env": {"PYTHONPATH":"${workspaceRoot} ...