1. 程式人生 > >寫程式分析堆記憶體溢位和棧記憶體溢位

寫程式分析堆記憶體溢位和棧記憶體溢位

打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 執行緒