JVM【第五回】:【OutOfMemoryError异常之Java堆溢出】

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

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

在Eclipse中的Run Configurations页签中设置虚拟机参数如下图所示:

代码如下:

package oom;

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

/**
 * JAVA堆溢出
 * @author Madison
 * @date 2014-7-11
 * VM Args: -Xms20M -Xmx20M -XX:+HeapDumpOnOutOfMemoryError
 */
public class HeapOOM 
{
	static class OOMObject{}

	public static void main(String[] args) 
	{
		List<OOMObject> list = new ArrayList<HeapOOM.OOMObject>();
		while(true)
			list.add(new OOMObject());
	}
}

运行结果:

java.lang.OutOfMemoryError:Java Heap space

Dumping Heap to java_pid3404.hprof...

Heap dump file created[22045981 bytes in 0.663 secs]

JVM【第五回】:【OutOfMemoryError异常之Java堆溢出】

时间: 2024-10-11 05:10:26

JVM【第五回】:【OutOfMemoryError异常之Java堆溢出】的相关文章

JVM【第八回】:【OutOfMemoryError异常之方法区溢出】

方法区用于存放Class的相关信息,如类名.访问修饰符.常量池.字段描述.方法描述等.对于这个区域的测试,基本的思路是运行时产生大量的类去填满方法区,虽然直接使用Java SE API也可以动态产生类(如反射时的GeneratedConstructorAccessor和动态代理等),在本代码中借助CGLib直接操作字节码运行时,生成大量的动态类. 这样的应用经常会出现在实际引用中:当前的很多主流框架,如Spring和Hibernate对类进行增强时,都会使用到CGLib这类字节码技术,增强的类越

了解OutOfMemoryError异常 - 深入Java虚拟机读后总结

JVM中的异常发生 Java虚拟机规范中除了程序计数器外,其他几个运行时区域都有发生OutOfMemoryError异常的可能. 本章笔记通过代码来验证Java虚拟机规范中描述的各个运行时区域存储的内容.以及在以后遇到实际的内存溢出异常时,能根据异常的信息快速判断是哪个区域出现的内存溢出.怎样的代码可能会导致这些区域的内存溢出.以及这些问题该如何处理. Java堆溢出:Java堆用于存储对象实例,只要不断的创建对象,并且保证GC Roots到对象之间有可达路径避免垃圾回收机制清除对象,就会在对象

OutOfMemoryError异常——Java堆溢出。

https://blog.csdn.net/en_joker/article/details/79726975 (将堆的最小值-Xms参数与最大值-Xmx参数设置为一样即可避免堆自动扩展),通过参数-XX:+HeapDumpOnOutOfMemoryError可以让虚拟机在出现内存溢出异常时Dump出当前的内存堆转储快照以便事后进行分析. Java堆内存的OOM异常是实际应用中常见的内存溢出异常情况.当出现Java堆内存溢出时,异常堆栈信息“java.lang.OutOfMemoryError”

java堆溢出的小栗子

package com.xiaoysec.test; import java.util.ArrayList; import java.util.List; /** *VM Args:-verbose:gc -Xms20M -Xmx20M -Xmn10M -XX:+PrintGCDetails -XX:SurvivorRatio=8 * @author xiaoysec * */ public class HeapOOM { static class OOMObject{ //定义一个静态内部类

java堆溢出

在Eclipse 配置运行参数或者在命令行中加上参数 eclipse 安装MAT插件,使用. 虚拟机栈内存溢出: 创建很多线程导致内存溢出,可以减少最大堆和减少栈容量. 方法区和运行时常量池溢出 在jdk1.6中intern()方法会把首次遇到的字符串实例复制到永久代.而由StringBuilder创建的字符串实例在java堆上,所以不是同一个引用.而JDK1.7的实现知识在常量池中记录首次出现的引用."java"这个字符串在执行之前就已经出现过了. 方法区溢出 大量产生java类的应

Java内存溢出异常(上)

上一篇文章我们讲了JVM运行时数据区域与内存溢出异常,其中对于内存溢出异常这部分将的不够详细,这篇文章将着重讲解Java内存溢出异常的相关知识.如果有没看过上一篇文章的小伙伴们,请点击Java内存区域与内存溢出异常. Java的内存溢出异常主要分为两类:分别是内存溢出和栈溢出.在以下几种情况,会抛出内存异常:Java堆溢出.虚拟机栈和本地方法栈溢出.方法区和运行时常量池溢出.以及本机直接内存溢出,下面讲一一介绍这几类异常. Java堆溢出 在Java内存区域与内存溢出异常中讲过,Java堆主要是

JVM运行时数据区--深入理解Java虚拟机 读后感

程序计数器 程序计数器是线程私有的区域,很好理解嘛~,每个线程当然得有个计数器记录当前执行到那个指令.占用的内存空间小,可以把它看成是当前线程所执行的字节码的行号指示器.如果线程在执行Java方法,这个计数器记录的是正在执行的虚拟机字节码指令地址:如果执行的是Native方法,这个计数器的值为空(Undefined).此内存区域是唯一一个在Java虚拟机规范中没有规定任何OutOfMemoryError情况的区域. Java虚拟机栈 与程序计数器一样,Java虚拟机栈也是线程私有的.其生命周期与

Java堆

Java堆的概念 java堆的特征 全局共享 通常是Java虚拟机中最大的一块内存区域 作用是作为java对象的主要存储区域 JVMS明确要求该区域需要实现自动内存管理,即常说的GC,但并不限制采用哪种算法和技术去实现 可能出现OutOfMemory异常 java堆可能发生如下异常情况: 如果实际所需的堆超过了自动内存管理系统能提供的最大容量,那Java虚拟机将会抛出一个OutOfMemoryError异常. Java堆是出现内存异常概率最大的区域

JVM --- OutOfMemoryError异常

在Java虚拟机规范的描述中,除了程序计数器外,虚拟机内存的其他几个运行时区域都有可能发生OutOfMemoryError(OOM)异常. 1.Java堆溢出 Java堆用于存储对象实例,只要不断地创建对象,并且保证GCRoots到对象之间有可大路径来避免垃圾回收机制清理这些对象,那么在对象数量到达最大堆的容量限制后就会产生内存溢出异常. 执行代码前提:Java堆大小为20MB,不可扩展(将堆的最小值-Xms参数与最大值-Xmx参数设置为一样即可避免堆自动扩展),通过参数-XX:+HeapDum