Java开发学习之Java中的CPU占用高和内存占用高的问题排查
小职 2021-03-10 来源 :JAVA高级架构 阅读 338 评论 0

摘要:本文主要介绍了Java开发学习之Java中的CPU占用高和内存占用高的问题排查,通过具体的内容向大家展现,希望对大家Java的学习有所帮助。

本文主要介绍了Java开发学习之Java中的CPU占用高和内存占用高的问题排查,通过具体的内容向大家展现,希望对大家Java的学习有所帮助。

Java开发学习之Java中的CPU占用高和内存占用高的问题排查


下面通过模拟实例分析排查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占用高和内存占用高的问题排查

 

 

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

 Java开发学习之Java中的CPU占用高和内存占用高的问题排查

 

 

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

 

 Java开发学习之Java中的CPU占用高和内存占用高的问题排查

 

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

 

jstack pid >> java.txt

内容如下:

 

mazhi@mazhi:~$ cat 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占用高和内存占用高的问题排查

 

 

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

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

 Java开发学习之Java中的CPU占用高和内存占用高的问题排查

 

 

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

 

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

 

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

执行命令如下图所示。

 Java开发学习之Java中的CPU占用高和内存占用高的问题排查

 

 

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

 

-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/tmp/heapdump.hprof

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

 

jhat dump.hprof

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

 Java开发学习之Java中的CPU占用高和内存占用高的问题排查

 

 

访问如下图所示。

 Java开发学习之Java中的CPU占用高和内存占用高的问题排查

 

 

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

 Java开发学习之Java中的CPU占用高和内存占用高的问题排查


我是小职,记得找我

✅ 解锁高薪工作

✅ 免费获取学习教程,开发工具,代码大全,参考书籍

Java开发学习之Java中的CPU占用高和内存占用高的问题排查

本文由 @小职 发布于职坐标。未经许可,禁止转载。
喜欢 | 0 不喜欢 | 0
看完这篇文章有何感觉?已经有0人表态,0%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程