寫程式分析堆記憶體溢位和棧記憶體溢位
阿新 • • 發佈:2019-02-15
打jar包 用命令java -jar xxx.jar
寫程式分析堆記憶體溢位
package com.mvntest.mvn; import java.util.ArrayList; import java.util.List; public class HeapOOM { public static void main(String[] args) throws InterruptedException{ int size = 1024 * 1024 * 8; List<byte[]> list = new ArrayList<byte[]>(); for(int i = 0; i < 1024; i++){ System.out.println("往JVM內寫入"+(i+1)+"M資料"); Thread.sleep(1000); list.add(new byte[size]); } } }
用jmap -histo 程序號 | more
檢視系統記憶體情況,由圖分析,bytes 在一直上升。
開啟jvisualVM 工具,檢視監視、執行緒、Visual GC。
在ecplise 中安裝MAT 在Help - Marketplace 中搜索Memory Analyzer 按照提示安裝後,重新啟動ecplise
在ecplise中 開啟File-open File 路徑選擇dump下來的檔案路徑,
進入dump頁面後顯示
點選 紅框內,在list objects 中選擇outgoing references 和incoming references 定位到程式碼
寫程式分析棧記憶體溢位
在Java專案中,有很多時候需要做執行緒dump,比如,系統掛起、死鎖、不能建立更多本地執行緒的OOME、CPU消耗過多等等;甚至有些堆記憶體溢位也可能跟執行緒有關,因為可能是建立了過多的執行緒導致堆記憶體不夠用。public class ThreadTest { public static void main(String[] args) throws InterruptedException{ for(int i = 0 ;i < 1000; i++){ Thread.sleep(1000); System.out.println(i); } } }
一直處於執行緒等待,在此頁面中,點選dump按鈕,打dump,把dump 拷到版本,,從最底下看mian 執行緒