java内存占用过高分析(Java中的CPU占用高和内存占用高的问题排查)

首页教程更新时间:2023-05-13 22:57:21

作者 | 归去来兮辞

来源 | urlify.cn/MBjaAz

76套java从入门到精通实战课程分享

下面通过模拟实例分析排查Java应用程序CPU和内存占用过高的过程。如果是Java面试,这2个问题在面试过程中出现的概率很高,所以我打算在这里好好总结一下。

1、Java CPU过高的问题排查

举个例子,如下:

package com.classloading;
public class Test {
static class MyThread extends Thread {
public void run() { // 死循环,消耗CPU
int i = 0;
while (true) {
i ;
}
}
}
public static void main(String args[]) throws InterruptedException {
new MyThread().start();
Thread.sleep(10000000);
}
}

使用top命令查看占用CPU过高的进程。如下图所示。

java内存占用过高分析,Java中的CPU占用高和内存占用高的问题排查(1)

查看进程6102下线程的占用情况,如下图所示。

java内存占用过高分析,Java中的CPU占用高和内存占用高的问题排查(2)

使用如下命令将6122转换为16进制表示,如下:

java内存占用过高分析,Java中的CPU占用高和内存占用高的问题排查(3)

导出CPU占用高进程的线程栈。命令如下:


jstack pid >> java.txt


Attaching to remote server pid, please wait...
2021-02-23 15:38:18
Full thread dump Java HotSpot(TM) 64-Bit Server VM (25.192-b12 mixed mode):

"Attach Listener" #10 daemon prio=9 os_prio=0 tid=0x00007f4ee0001000 nid=0x1956 runnable [0x0000000000000000]
java.lang.Thread.State: RUNNABLE
// 这是0x17ea线程,也是占用CPU最高的线程
"Thread-0" #9 prio=5 os_prio=0 tid=0x00007f4f180d6000 nid=0x17ea runnable [0x00007f4f044da000]
java.lang.Thread.State: RUNNABLE
at com.cpuhigh.Test$MyThread.run(Test.java:8) // 这里指示第8行,则正是死循环的代码开始

...

内容如下:  

导出的堆栈信息有线程的状态(一般要找RUNNABLE状态)和调用堆栈结合来查找问题。线程dump分析:线程dump分析主要目的是定位线程长时间停顿的原因

java内存占用过高分析,Java中的CPU占用高和内存占用高的问题排查(4)

2、Java 内存过高的问题排查

举个例子如下:

package com.classloading;

import java.util.ArrayList;
import java.util.List;

public class Test {
private static final int UNIT_MB = 1024 * 1024;

public static void main(String args[]) throws InterruptedException{
List<Object> x = new ArrayList<Object>();
int i = 0;
while(i<1000){
x.add(new byte[UNIT_MB]);
i ;
}
Thread.sleep(1000000000);
}
}

通过jmap dump内存快照。如果是线上环境,注意dump之前必须先将流量切走,否则大内存dump是直接卡死服务。

命令行输入:


jmap -histo <pid> | head -20

java内存占用过高分析,Java中的CPU占用高和内存占用高的问题排查(5)

就可以查看某个pid的java服务占用内存排名前20的类,如下图所示。

可以看到,占用内存最多的是byte字节数组,共有1008个实例。

jmap还有一个指令可以把整个内存情况转成文件形式保存下来,如下:

jmap -dump:format=b,file=filename.bin <pid>

java内存占用过高分析,Java中的CPU占用高和内存占用高的问题排查(6)

执行命令如下图所示。

可以在JVM启动时设置,如果发生OOM,则dump出文件。命令如下:

-XX: HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/tmp/heapdump.hprof
jmap -dump:format=b,file=filename.bin <pid>

如果快照文件不大,可以下载到本地,然后通过MAT分析,也可以在线分析(https://fastthread.io/);如果快照文件很大,可以在服务器上直接分析,使用的命令是:

jhat dump.hprof

jhat也是jdk内置的工具之一。主要是用来分析java堆的命令,可以将堆中的对象以html的形式显示出来,包括对象的数量,大小等等,并支持对象查询语言。命令执行后如下图所示。

java内存占用过高分析,Java中的CPU占用高和内存占用高的问题排查(7)

访问如下图所示。

java内存占用过高分析,Java中的CPU占用高和内存占用高的问题排查(8)

其中的Show heap histogram就会显示对象占用内在的大小。如下图所示。

java内存占用过高分析,Java中的CPU占用高和内存占用高的问题排查(9)

,
图文教程
相关文章
热门专题
推荐软件
奇热小说
奇热小说
下载
QQ2019手机版
QQ2019手机版
下载
王者荣耀
王者荣耀
下载
百度浏览器迷你版
百度浏览器迷你版
下载
2345浏览器手机版
2345浏览器手机版
下载
网易邮箱
网易邮箱
下载
爱奇艺
爱奇艺
下载
网易云音乐
网易云音乐
下载
WPSOffice
WPSOffice
下载
优酷
优酷
下载
谷歌浏览器(Chrome)
谷歌浏览器(Chrome)
下载
迅雷看看播放器
迅雷看看播放器
下载
UC浏览器
UC浏览器
下载
QQ音乐
QQ音乐
下载
阿里旺旺买家版v9.12.10C官方版
阿里旺旺买家版v9.12.10C官方版
下载
360安全卫士v12.1官方版
360安全卫士v12.1官方版
下载
猜你喜欢
天魔录内购版
天魔录内购版
下载
艺头条
艺头条
下载
看书宝1.0.2.1免安装版
看书宝1.0.2.1免安装版
下载
zoomcloudmeetings(视频会议软件)v5.0.41687.0910官方版
zoomcloudmeetings(视频会议软件)v5.0.41687.0910官方版
下载
刀塔帝国iPhone版
刀塔帝国iPhone版
下载
火蚁模拟器
火蚁模拟器
下载
僵尸部队4死亡战争第一季完美存档
僵尸部队4死亡战争第一季完美存档
下载
国资e学
国资e学
下载
创业伙伴
创业伙伴
下载
磁力资源搜索助手v20.09.15免费版
磁力资源搜索助手v20.09.15免费版
下载
Byte智能电动车
Byte智能电动车
下载
冒个泡
冒个泡
下载
地穴潜行者
地穴潜行者
下载
麻将来了作弊器
麻将来了作弊器
下载
慧拼团
慧拼团
下载
CropAndNoteMac版V1.2
CropAndNoteMac版V1.2
下载