jvm内存模型分析(5)堆内存溢出以及分析

硅谷探秘者 2814 0 0

jvm内存模型分析(5)堆内存溢出以及分析

1.模拟堆内存溢出代码

package test;

import java.util.ArrayList;
import java.util.List;
/**
 * VM Args:-Xms20m -Xmx20m -XX:+HeapDumpOnOutOfMemoryError
 * @author zzm
 */
public class HeapOOM {
	static class OOMObject {
	}
	public static void main(String[] args) {
		List<OOMObject> list = new ArrayList<OOMObject>();
		while (true) {
			list.add(new OOMObject());
		}
	}
}

2.jvm启动参数设置

        目的是因为jvm虚拟机初始的内存还是挺大的,所以缩小堆内存,来快速实现内存溢出。

-Xms20m -Xmx20m -XX:+HeapDumpOnOutOfMemoryError

QQ截图20190302191012.png

3.程序运行结果:

java.lang.OutOfMemoryError: Java heap space
Dumping heap to java_pid8452.hprof ...
Heap dump file created [27943398 bytes in 0.070 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 test.HeapOOM.main(HeapOOM.java:15)

QQ截图20190302191111.png



4.分析:

        Java堆用于存储对象实例,只要不断地创建对象,并且保证 GC Roots到对象之间有可达路径来避免垃圾回收机制清除这些对象,那么在对象数量到达最大堆的容量限制后就会产生内存溢出异常。

        代码中限制Java堆的大小为20MB,不可扩展(将堆的最小值-Xms参数与最大值-Xmx参数设置为一样即可避免堆自动扩展),通过参数-XX+Heap DumpOnOutofMemoryError可以让虚拟机在出现内存溢出异常时Dump出当前的内存堆转储快照以便事后进行分析。


        程序运行结束以后刷新文件夹会出现一个快照文件


QQ截图20190302191314.png


        然后利用eclipse memory analyzer内存分析工具,进行分析,定位出现问题的类,和方法,从而找到解决问题的方法


QQ截图20190302191533.png

QQ截图20190302191641.png

QQ截图20190302192011.png


        从中我们可以发现,在主线程中,也就是main函数中创建了大量的 OOMObject 对象,并且对象被list集合应用,无法被释放,导致内存溢出。从而定位到问题。


猜你喜欢
java虚拟机(jvm) 2425 jvm(1)Java虚拟机在执行Java程序的过程中会把它所管理的为若干个不同的数据区域jvm包括三大子系统:类加载子系统,运行时数据区(结构),执行引擎详细图示
java虚拟机(jvm) 4031 jvm(1)已经对进行了一个宏观的概括http://www.jiajiajia.club/weblog/blog/artical/82那么下边具体一下方法执行的过程还是一个
java虚拟机(jvm) 4123 Jvm-class文件结构下面的类为例介绍一下class文件的结构packagejvm;publicclassMainTest{publicstaticinta=0
java虚拟机(jvm) 937 jvm-垃圾收集器和配策略(1)说起垃圾收集(GarbagcCollcction,GC),大部人都把这项技术当做java语言的伴生产物。事实上,GC的历史比Java久远,1960
java虚拟机(jvm) 3127 类加载的时机类从被加载到虚拟机中开始,到卸载为止,它的整个生命周期包括:加载(LoadingVerification)、准备(Preparation)、解(Resolution)、初始化
java虚拟机(jvm) 1180 jmap是java虚拟机自带的一种映像工具,我们可通过该工具配合不同的参数来查看java虚拟机的详细信息(如程序中现的所有对象的数量占用大小等),通过虚拟机的使用情况来定
java虚拟机(jvm) 1717 这里HotSpot为例,且所说的对象指普通的Java对象,不包括数组和Class对象等。参考资料深入理解java虚拟机《周志明》1.对象的布局HotSpot虚拟机中,对象在储的布局可
java虚拟机(jvm) 3173 (StackFrame)用于储局部变量表、操作数栈、动态链接、方法口等信息。局部变量表是一组变量值储空间,用于放方法参数和方法部定义的局部变量。在Java程序被编译为Class文件时,就在方法的Code属性
归档
2018年11月  12 2018年12月  33 2019年01月  28 2019年02月  28 2019年03月  32 2019年04月  27 2019年05月  33 2019年06月  6 2019年07月  12 2019年08月  12 2019年09月  21 2019年10月  8 2019年11月  15 2019年12月  25 2020年01月  9 2020年02月  5 2020年03月  16 2020年04月  4 2020年06月  1 2020年07月  7 2020年08月  13 2020年09月  9 2020年10月  5 2020年12月  3 2021年01月  1 2021年02月  5 2021年03月  7 2021年04月  4 2021年05月  4 2021年06月  1 2021年07月  7 2021年08月  2 2021年09月  8 2021年10月  9 2021年11月  16 2021年12月  14 2022年01月  7 2022年05月  1 2022年08月  3 2022年09月  2 2022年10月  2 2022年12月  5 2023年01月  3
标签
算法基础 linux 前端 c++ 数据结构 框架 数据库 计算机基础 储备知识 java基础 ASM 其他 深入理解java虚拟机 nginx git 消息中间件 搜索 maven redis docker dubbo vue 导入导出 软件使用 idea插件 协议 无聊的知识 jenkins springboot mqtt协议 keepalived minio mysql ensp 网络基础 xxl-job rabbitmq haproxy
目录
没有一个冬天不可逾越,没有一个春天不会来临。最慢的步伐不是跬步,而是徘徊,最快的脚步不是冲刺,而是坚持。