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

本文详细解析了JDK、JRE与JVM的关系,通过OOM(Out of Memory)示例深入理解JVM内存管理机制。介绍了如何通过配置参数进行快照分析,定位内存泄漏原因,提供了一种有效的问题排查方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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()的代码块

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值