模拟内存溢出
一、新建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,选择刚刚生成的快照文件,打开。打开后可以看到下图。
点击下图图标,可以看到内存详细信息
内存详细信息如图
可以看到,红框处占用内存最多。将其展开继续深追,如下图