JVM学习(一)-初步认识JVM

1.主要结构

JDK(Java Development Kit),Jre(Java Runtime Environment),JVM(Java Virtual Machine)的关系

JDK包含Jre;Jre包含JVM

JDK1.7结构视图:

JVM学习(一)-初步认识JVM_第1张图片

JDK1.8结构视图:

JVM学习(一)-初步认识JVM_第2张图片

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 demoList = new ArrayList<>();
        while (true){
            //进行无限循环添加对象Demo
            demoList.add(new Demo());
        }
    }
}

最后结果会提示:

内存溢出:提示堆溢出,堆存放的是我们的对象,当需要存放新的对象申请的内存无法得到满足是就会抛出这个异常

JVM学习(一)-初步认识JVM_第3张图片

2.2使用参数配置进行快照分析查看溢出原因

首先对IDEA中的应用运行参数进行配置

JVM学习(一)-初步认识JVM_第4张图片

-XX:+HeapDumpOnOutOfMemoryError:加入当前堆存储快照,便于分析内存溢出的原因

-Xms20m -Xmx20m:设置堆内存为20M,最大内存为20M,这里测试避免运行时间过长

这时再次运行发现会有一个dump快照文件生成:

JVM学习(一)-初步认识JVM_第5张图片

文件会存在于当前项目文件夹下,打开是乱码,需要使用特定的工具进行查看

2.3查看分析快照文件

可以使用Elipse的Memory Analyse进行查看该文件

选择对应的版本下载好之后进行MemoryAnalyzer

JVM学习(一)-初步认识JVM_第6张图片

在最下方选择打开一个dump快照文件

然后选择之前项目下生成的快照文件即可

这里可以看到之前我们设置的是最大堆内存为20M

这里线程main堆总共15.7M,占用了15.5M时发生了内存溢出

JVM学习(一)-初步认识JVM_第7张图片

使用树结构进行查看内存的占用情况:

这里我们可以看到占用堆内存最大的是我们的main线程

打开main后可以看到占用内存最多的是我们的一个Object对象,左侧显示出了该对象为我们之前创建的Demo对象

所以找到内存泄漏的原因为对内存一直添加Demo对象,可以定位到我们的添加new Demo()的代码块

JVM学习(一)-初步认识JVM_第8张图片

你可能感兴趣的:(JVM)