小白jvm之一-内存溢出场景模拟

小白jvm之一-内存溢出场景模拟

一、jdk,jre,jvm关系
二、内存溢出场景模拟

一、jdk,jre,jvm关系

JDK(Java Development Kit)
JRE(Java Runtime Environment)
JVM(Java Virtual Machine)

在Java平台标准版7中,三者关系如下:
在这里插入图片描述
在Java平台标准版8中,三者关系如下:
在这里插入图片描述
由此可见,两个版本的区别在于jvm是否包含在Java SE API中,但尽管两个版本略有不同,最后都是jdk包含jre,jre包含jvm。

二、内存溢出场景模拟

创建一个Demo类

public class Demo {

}

创建一个Main类

import java.util.ArrayList;
import java.util.List;

public class Main {
	public static void main(String[] args) {
		List<Demo> demoList = new ArrayList<>();
		while (true) {
			demoList.add(new Demo());//不断创建对象,导致内存溢出
		}
	}
}

错误代码,堆内存溢出

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
	at java.util.Arrays.copyOf(Unknown Source)
	at java.util.Arrays.copyOf(Unknown Source)
	at java.util.ArrayList.grow(Unknown Source)
	at java.util.ArrayList.ensureExplicitCapacity(Unknown Source)
	at java.util.ArrayList.ensureCapacityInternal(Unknown Source)
	at java.util.ArrayList.add(Unknown Source)
	at com.zhongyp.test1.Main.main(Main.java:10)

我们在进行项目开发的时候,通常是很难定位到具体代码,这时候我们需要借助分析工具去帮助我们定位。
首先,我们需要把堆内存转储成一个快照,然后通过快照去分析定位具体代码。

-Xms20m -Xmx20m -XX:+HeapDumpOnOutOfMemoryError

这里在提示内存溢出之前把堆转储成一个快照了,一般是在项目目录下

java.lang.OutOfMemoryError: Java heap space
Dumping heap to java_pid2020.hprof ...
Heap dump file created [27949335 bytes in 0.093 secs]
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
	at java.util.Arrays.copyOf(Unknown Source)
	at java.util.Arrays.copyOf(Unknown Source)
	at java.util.ArrayList.grow(Unknown Source)
	at java.util.ArrayList.ensureExplicitCapacity(Unknown Source)
	at java.util.ArrayList.ensureCapacityInternal(Unknown Source)
	at java.util.ArrayList.add(Unknown Source)
	at com.zhongyp.test1.Main.main(Main.java:10)

拿到快照之后,我们需要一个分析工具:Memory Analyzer
下载地址:https://www.eclipse.org/mat/downloads.php 选择适合的版本下载
直接解压即可使用
在这里插入图片描述
选择上面转储的快照
在这里插入图片描述
点击加载堆内存树信息
在这里插入图片描述
在这里插入图片描述
即可定位到具体代码
在这里插入图片描述
最后,在定位出具体代码后,首先应确定是否是代码问题,如代码问题应优化,修改代码;若代码正常,则可通过改大堆内存,增加物理内存等方法处理。

以上是本人通过学习叶子猿老师的深入理解Java虚拟机(jvm性能调优+内存模型+虚拟机原理)学习笔记,若有问题,请及时联系我删除。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值