1.jdk,jre,jvm的区别:
jdk: java的开发环境
jre:java的运行环境
jvm:java虚拟机
oracle的官方图解:
jdk>jre>jvm
2.第一个内存溢出(java.lang.OutOfMemoryError)代码:
package com.xc.test;
import java.util.ArrayList;
import java.util.List;
public class Test1 {
public static void main(String[] args) {
List<Demo> list=new ArrayList<Demo>();
while(true){
list.add(new Demo());
}
}
}
运行报错:
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at java.util.Arrays.copyOf(Arrays.java:3210)
at java.util.Arrays.copyOf(Arrays.java:3181)
at java.util.ArrayList.grow(ArrayList.java:261)
at java.util.ArrayList.ensureExplicitCapacity(ArrayList.java:235)
at java.util.ArrayList.ensureCapacityInternal(ArrayList.java:227)
at java.util.ArrayList.add(ArrayList.java:458)
at com.xc.test.Test1.main(Test1.java:12)
运行设置jvm参数:
+HeapDumpOnOutOfMemoryError :生成分析文件
生成的分析文件在项目目录下:
3.一款eclipse查看分析文件的工具:
Memory Analyzer
下载地址:
https://www.eclipse.org/mat/downloads.php
下载好了之后 解压并打开:
并打开刚刚生成的java_pid3836.hprof 后缀为hprof的文件
如下:
共20m的堆内存 这块区域占了15m 所以可能出错的地方就在这一块
点击如下更换视图,可以看到是main这个线程占用了绝大多数的内存
接着展开我们可以看到 ,是代码新建了许许多多的demo对象导致内存占用比较多。
初始jvm完毕。