Java基础、中级、高级、架构面试资料

拜托别再问我CPU过高100%,内存泄露的问题了!

JAVA herman 4854浏览
公告:“业余草”微信公众号提供免费CSDN下载服务(只下Java资源),关注业余草微信公众号,添加作者微信:xttblog2,发送下载链接帮助你免费下载!
本博客日IP超过2000,PV 3000 左右,急需赞助商。
极客时间所有课程通过我的二维码购买后返现24元微信红包,请加博主新的微信号:xttblog2,之前的微信号好友位已满,备注:返现
受密码保护的文章请关注“业余草”公众号,回复关键字“0”获得密码
所有面试题(java、前端、数据库、springboot等)一网打尽,请关注文末小程序
视频教程免费领
腾讯云】1核2G5M轻量应用服务器50元首年,高性价比,助您轻松上云

群里经常有网友提问 CPU,内存相关的问题。还有一些索引问题,QPS 等问题。以至于我写了很多拜托系列的文章。

比如,这两篇《拜托别在问我 MySQL 性能优化了!》、《拜托,别再问我 QPS、TPS、PV、UV、GMV、IP、RPS 好吗?》。

昨天晚上又有网友在微信群里问我关于 CPU 超过,内存占用太大的问题怎么解决和排查,今天我们就再写一个拜托系列的文章,彻底告别 Java 内存泄露和 CPU 百分之几百的问题。

写什么内容,你们决定!

java cpu 100%

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

java cpu 100%

服务器的 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. 不靠谱的算法

那么怎么排查这类问题呢?

很简单,按照下面几个步骤执行即可。

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

然后在执行“top -Hp 进程PID”命令。进程PID 是上一步 top 命令找出来的。例如,执行“top -Hp 28174 -d 1 -n 1”命令,查出占 CPU 最高的线程。

CPU 100% 问题解决方法

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

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

printf 命令,将 10 进制转化成 16 进制

然后再执行“jstack -l 20765 | grep 511e -A 20”命令,查看线程堆栈信息。

jstack 命令教程

内存泄露

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

排查过程也很简单。使用 jstat -gc pid 命令查看了 java 进程的 GC 状态。如果在频繁的发生 GC,那么你的程序肯定有问题。例如下面的 Full 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。知道你找到占用内存最大的对象,查看具体的代码,解决问题,发布版本,更新程序。

堆内存溢出排查方法这东西并不难,只有你经历过一次,你才会涅槃重生!

业余草公众号

最后,欢迎关注我的个人微信公众号:业余草(yyucao)!可加作者微信号:xttblog2。备注:“1”,添加博主微信拉你进微信群。备注错误不会同意好友申请。再次感谢您的关注!后续有精彩内容会第一时间发给您!原创文章投稿请发送至532009913@qq.com邮箱。商务合作也可添加作者微信进行联系!

本文原文出处:业余草: » 拜托别再问我CPU过高100%,内存泄露的问题了!