模擬內存溢出
一、新建java項目
二、代碼如下
package com.zjt.test.jvm003;
public class Demo {
}
package com.zjt.test.jvm003;
import java.util.ArrayList;
public class Main {
public static void main(String[] args) {
ArrayList<Demo> arrayList = new ArrayList<Demo>();
while (true) {
Demo demo = new Demo();
arrayList.add(demo);
}
}
}
三、執行程序、觀察內存
執行Main中的main方法,通過任務管理器觀察內存情況,發現內存一直上漲,當漲到一定程度時候程序會拋出如下異常,即爲內存溢出。
生成堆內存快照
一、eclipse中項目JVM參數設置
項目上右鍵---Run As---Run Configurations,按照下圖所示配置VM arguments
配置內容:-XX:+HeapDumpOnOutOfMemoryError -Xms20m -Xmx20m
其中-XX:+HeapDumpOnOutOfMemoryError指的是在堆溢出時保存快照。
其中-Xms20m -Xmx20m是設置JVM最大和最小堆內存都爲20m。配置這裏是因爲我們要模擬內存溢出,若不把內存設置小點,程序運行後要等很久纔可以看到內存溢出信息。
二、運行程序、查看快照
當我們再次運行程序後,會發現多了一條錯誤提示,如下圖所示
快照文件保存在我們項目根目錄下,進入項目根目錄,可以看到下圖所示內容。
快照文件使用文本工具打開是亂碼,需要使用內存分析工具進行查看分析。這裏我們內存分析工具使用Eclipse Memory Analyzer。
三、下載安裝內存分析工具Eclipse Memory Analyzer
下載地址:http://www.eclipse.org/mat/downloads.php
下載後解壓縮,雙擊其目錄下MemoryAnalyzer-1.7.0.20170613-win32.win32.x86_64\mat\MemoryAnalyzer.exe文件打開工具,打開後界面如圖所示。
四、導入內存快照文件分析
點擊File---OpenFile,選擇剛剛生成的快照文件,打開。打開後可以看到下圖。
點擊下圖圖標,可以看到內存詳細信息
內存詳細信息如圖
可以看到,紅框處佔用內存最多。將其展開繼續深追,如下圖