java cpu高_Java中的CPU占用高和内存占用高的问题排查
下面通過模擬實例分析排查Java應用程序CPU和內存占用過高的過程。如果是Java面試,這2個問題在面試過程中出現(xiàn)的概率很高,所以我打算在這里好好總結一下。
1、Java CPU過高的問題排查
舉個例子,如下:
package?com.classloading;
public?class?Test?{
static?class?MyThread?extends?Thread?{
public?void?run()?{?//?死循環(huán),消耗CPU
int?i=0;
while?(true)?{
i++;
}
}
}
public?static?void?main(String?args[])?throws?InterruptedException?{
new?MyThread().start();
Thread.sleep(10000000);
}
}
使用top命令查看占用CPU過高的進程。如下圖所示。
查看進程6102下線程的占用情況,如下圖所示。
使用如下命令將6122轉換為16進制表示,如下:
導出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=9os_prio=0tid=0x00007f4ee0001000nid=0x1956runnable?[0x0000000000000000]
java.lang.Thread.State:?RUNNABLE
//?這是0x17ea線程,也是占用CPU最高的線程
"Thread-0"?#9?prio=5os_prio=0tid=0x00007f4f180d6000nid=0x17earunnable?[0x00007f4f044da000]
java.lang.Thread.State:?RUNNABLE
at?com.cpuhigh.Test$MyThread.run(Test.java:8)??//?這里指示第8行,則正是死循環(huán)的代碼開始
...
導出的堆棧信息有線程的狀態(tài)(一般要找RUNNABLE狀態(tài))和調用堆棧結合來查找問題。線程dump分析:線程dump分析主要目的是定位線程長時間停頓的原因
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{
Listx=newArrayList();
int?i=0;
while(i<1000){
x.add(new?byte[UNIT_MB]);
i++;
}
Thread.sleep(1000000000);
}
}
通過jmap dump內存快照。 如果是線上環(huán)境,注意dump之前必須先將流量切走,否則大內存dump是直接卡死服務。
命令行輸入:
jmap?-histo|?head?-20
就可以查看某個pid的java服務占用內存排名前20的類,如下圖所示。
可以看到,占用內存最多的是byte字節(jié)數(shù)組,共有1008個實例。
jmap 還有一個指令可以把整個內存情況轉成文件形式保存下來,如下:
jmap-dump:format=b,file=filename.bin
執(zhí)行命令如下圖所示。
可以在JVM啟動時設置,如果發(fā)生OOM,則dump出文件。命令如下:
-XX:+HeapDumpOnOutOfMemoryError-XX:HeapDumpPath=/tmp/heapdump.hprof
如果快照文件不大,可以下載到本地,然后通過 MAT 分析,也可以在線分析( https://fastthread.io/ );如果快照文件很大,可以在服務器上直接分析,使用的命令是:
jhat?dump.hprof
jhat也是jdk內置的工具之一。主要是用來分析java堆的命令,可以將堆中的對象以html的形式顯示出來,包括對象的數(shù)量,大小等等,并支持 對象查詢語言 。命令執(zhí)行后如下圖所示。
訪問如下圖所示。
其中的Show heap histogram就會顯示對象占用內在的大小。如下圖所示。
【責任編輯:龐桂玉 TEL:(010)68476606】
點贊 0
總結
以上是生活随笔為你收集整理的java cpu高_Java中的CPU占用高和内存占用高的问题排查的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql 导入日期 0000_解决Ex
- 下一篇: java数组数据结构_Java数据结构之