JAVA記憶體分析
引言
Java程式在服務端運行的時候,在長時間運行或者訪問量較大的時候,會遇見記憶體溢位的情況,
這時如果我們沒有進行JVM的記憶體分析,將無法對問題進行定位,那么我們即使對服務端進行重啟,在后續的運行程序中,還是會預見記憶體溢位的情況,
那么我們結合實際情況,通過一些實體來模擬記憶體溢位的情況,及如何去分析,
正文
1,模擬記憶體溢位
1.1 新建一個bean物件
package com.moonl.jvm.beans;
public class MemoryOverflow {
}
1.2 建一個main方法來進行程式的運行
package com.moonl.jvm;
import com.moonl.jvm.beans.MemoryOverflow;
import org.springframework.boot.test.context.SpringBootTest;
import java.util.ArrayList;
import java.util.List;
@SpringBootTest
public class MemoryOverflowTest {
public static void main(String[] args) {
List<MemoryOverflow> list = new ArrayList<>();
while (true){
list.add(new MemoryOverflow());
}
}
}
1.3 設定運行時的記憶體

這里我們設定運行時的記憶體為21M

現在我們開始運行程式
這時一段很簡單的代碼,無限回圈,不斷的將創建一個物件,并加入到list當中,此時我們發現報錯提示,記憶體溢位了,
我們生產環境,系統后臺的運行時記憶體溢位,就這樣模擬出來了,

2,定位問題
當我們生產環境,出現記憶體溢位之后,面對量級比較大的系統,一般是無法通過日志進行定位記憶體溢位的位置,那么就需要在運行時,加上一段引數,生成運行時記憶體溢位的快照,
-Xms21m -Xmx21m -XX:+HeapDumpOnOutOfMemoryError
如圖所示:

運行后,會出現如圖所示:

在程式的工程目錄報里面,我們就可以找到,剛生成的檔案快照,但該檔案的閱讀方式,需要單獨下載單獨的工具進行查詢,
這里我使用的是:Jprofiler 大家可以去下載,安裝程序不再累述,

3,分析記憶體溢位的原因
打開Jprofiler—Session—open Snapshot

彈出對話框后,選擇要進行分析的檔案

就可以看到是什么原因造成記憶體溢位的,當然在進行生產環境的記憶體溢位分析時,需要排查和分析的地方更多

后記
總結一下,本文所述的方法是在采用在vm options:-Xms21m -Xmx21m -XX:+HeapDumpOnOutOfMemoryError,中
添加HeapDumpOnOutOfMemoryError,生成快照日志完成的,下一期,我們將講解通過idea和jprofiler進行整合,查看
記憶體運行情況,
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/231472.html
標籤:其他
