1.主要结构
JDK(Java Development Kit),Jre(Java Runtime Environment),JVM(Java Virtual Machine)的关系
JDK包含Jre;Jre包含JVM
JDK1.7结构视图:
JDK1.8结构视图:
2.通过OOM示例初步了解JVM
2.1测试OOM
package com.test;
import java.util.ArrayList;
import java.util.List;
/**
* @Author: clf
* @Date: 18-12-13
* @Description:
*/
public class Main {
public static void main(String[] args) {
List<Demo> demoList = new ArrayList<>();
while (true){
//进行无限循环添加对象Demo
demoList.add(new Demo());
}
}
}
最后结果会提示:
内存溢出:提示堆溢出,堆存放的是我们的对象,当需要存放新的对象申请的内存无法得到满足是就会抛出这个异常
2.2使用参数配置进行快照分析查看溢出原因
首先对IDEA中的应用运行参数进行配置
-XX:+HeapDumpOnOutOfMemoryError:加入当前堆存储快照,便于分析内存溢出的原因
-Xms20m -Xmx20m:设置堆内存为20M,最大内存为20M,这里测试避免运行时间过长
这时再次运行发现会有一个dump快照文件生成:
文件会存在于当前项目文件夹下,打开是乱码,需要使用特定的工具进行查看
2.3查看分析快照文件
可以使用Elipse的Memory Analyse进行查看该文件
选择对应的版本下载好之后进行MemoryAnalyzer
在最下方选择打开一个dump快照文件
然后选择之前项目下生成的快照文件即可
这里可以看到之前我们设置的是最大堆内存为20M
这里线程main堆总共15.7M,占用了15.5M时发生了内存溢出
使用树结构进行查看内存的占用情况:
这里我们可以看到占用堆内存最大的是我们的main线程
打开main后可以看到占用内存最多的是我们的一个Object对象,左侧显示出了该对象为我们之前创建的Demo对象
所以找到内存泄漏的原因为对内存一直添加Demo对象,可以定位到我们的添加new Demo()的代码块