Java中的CPU占用高和内存占用高的问题排查

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

公司主营业务:成都网站设计、网站制作、移动网站开发等业务。帮助企业客户真正实现互联网宣传,提高企业的竞争能力。成都创新互联公司是一支青春激扬、勤奋敬业、活力青春激扬、勤奋敬业、活力澎湃、和谐高效的团队。公司秉承以“开放、自由、严谨、自律”为核心的企业文化,感谢他们对我们的高要求,感谢他们从不同领域给我们带来的挑战,让我们激情的团队有机会用头脑与智慧不断的给客户带来惊喜。成都创新互联公司推出娄烦免费做网站回馈大家。

1、Java CPU过高的问题排查

举个例子,如下:

 
 
 
 
  1. package com.classloading;  
  2. public class Test {  
  3.     static class MyThread extends Thread {  
  4.         public void run() { // 死循环,消耗CPU  
  5.             int i = 0;  
  6.             while (true) {  
  7.                 i++;  
  8.             }  
  9.         }  
  10.     }  
  11.     public static void main(String args[]) throws InterruptedException {  
  12.         new MyThread().start();  
  13.         Thread.sleep(10000000);  
  14.     }  

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

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

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

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

 
 
 
 
  1. jstack pid >> java.txt 

内容如下:

 
 
 
 
  1. mazhi@mazhi:~$ cat java.txt   
  2. Attaching to remote server pid, please wait...  
  3. 2021-02-23 15:38:18  
  4. Full thread dump Java HotSpot(TM) 64-Bit Server VM (25.192-b12 mixed mode):  
  5. "Attach Listener" #10 daemon prio=9 os_prio=0 tid=0x00007f4ee0001000 nid=0x1956 runnable [0x0000000000000000]  
  6.    java.lang.Thread.State: RUNNABLE  
  7. // 这是0x17ea线程,也是占用CPU最高的线程  
  8. "Thread-0" #9 prio=5 os_prio=0 tid=0x00007f4f180d6000 nid=0x17ea runnable [0x00007f4f044da000]  
  9.    java.lang.Thread.State: RUNNABLE  
  10.     at com.cpuhigh.Test$MyThread.run(Test.java:8)  // 这里指示第8行,则正是死循环的代码开始  
  11. ... 

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

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

举个例子如下:

 
 
 
 
  1. package com.classloading;  
  2. import java.util.ArrayList;  
  3. import java.util.List;  
  4. public class Test {  
  5.     private static final int UNIT_MB = 1024 * 1024;  
  6.      public static void main(String args[]) throws InterruptedException{  
  7.         List x = new ArrayList();  
  8.         int i = 0;  
  9.         while(i<1000){  
  10.             x.add(new byte[UNIT_MB]);  
  11.             i++;  
  12.         }  
  13.         Thread.sleep(1000000000);  
  14.     }  
  15. 通过jmap dump内存快照。 如果是线上环境,注意dump之前必须先将流量切走,否则大内存dump是直接卡死服务。

    命令行输入:

     
     
     
     
    1. jmap -histo  | head -20 

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

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

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

     
     
     
     
    1. jmap -dump:format=b,file=filename.bin  

    执行命令如下图所示。

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

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

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

     
     
     
     
    1. jhat dump.hprof 

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

    访问如下图所示。

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

    网页标题:Java中的CPU占用高和内存占用高的问题排查
    URL链接:http://www.36103.cn/qtweb/news26/26376.html

    网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

    广告

    声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联