OutOfMemoryError/OOM/内存溢出异常实例分析--堆内存异常

Java堆内存溢出

只要不断创建对象,并且保证GC Roots到对象之间有可达路径来避免垃圾回收机制清除这些对象,

那么在对象数量到达最大堆的容量限制后就会产生内存溢出异常,代码如下:

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

public class HeapOOM {

    static class OOMObject {

    }

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

}

在运行的时候,需要设置一下Java堆的大小,并且不可扩展,操作如下:

然后填写JVM启动参数:-Xms20m -Xmx20m -XX:+HeapDumpOnOutOfMemoryError

限制Java堆大小20m,最大值和最小值一致就达到不可扩展的目的了,-XX:+HeapDumpOnOutOfMemoryError参数可以让虚拟机在出现

内存溢出异常时Dump出当前的内存转储快照以便事后分析。(感兴趣的可以使用内存映像分析工具Eclipse Memory Analyzer打开堆转储快照文件进行分析)

运行结果如下:

原文地址:https://www.cnblogs.com/java-spring/p/9851597.html

时间: 2024-10-11 15:34:24

OutOfMemoryError/OOM/内存溢出异常实例分析--堆内存异常的相关文章

关于JVM内存溢出的原因分析及解决方案探讨

前言:JVM中除了程序计数器,其他的区域都有可能会发生内存溢出. 0.什么是内存溢出 当程序需要申请内存的时候,由于没有足够的内存,此时就会抛出OutOfMemoryError,这就是内存溢出. 1.内存泄漏和内存溢出区别与联系 内存泄漏:系统分配的内存没有被回收. 内存溢出:分配的内存空间超过系统内存. 2.内存泄漏的原因分析   jvm由5大块组成:堆,栈,本地方法栈,程序计数器,方法区.栈它的主要记录方法的执行和对象的引用.堆则存在真正的引用的对象. 内存泄漏是由于使用不当,把一部分内存“

jvm虚拟机(一):jvm内存溢出问题的分析与解决

??学习一下java虚拟机系列,之一 添加运行参数-XX:+HeapDumpOnOutOfMemoryError -Xms30m -Xmx30m -XX:+HeapDumpOnOutOfMemoryError 这个参数会生成堆栈快照,用于定位异常 模拟内存溢出的场景,简单代码: 123456789101112131415161718192021222324252627282930313233 package top.alertcode.demo.jvm; import java.util.Arr

JAVA 从GC日志分析堆内存 第七节

JAVA 从GC日志分析堆内存 第七节 在上一章中,我们只设置了整个堆的内存大小.但是我们知道,堆又分为了新生代,年老代.他们之间的内存怎么分配呢?新生代又分为Eden和Survivor,他们的比例大小能改变吗?其实这些都是可控的,以前没有讲到是因为就算讲了也只是讲讲而已,看不到实质性的东西.因此这章我们通过分析GC日志来一步步讲解如何细化设置堆内存. 首先我们来了解几个相关的参数: -XX:+PrintGCDetails:用于告诉虚拟机回收垃圾的时候顺便打印日志. -Xloggc:路径 :将打

Java JVM:内存溢出(栈溢出,堆溢出,持久代溢出以及 nable to create native thread)

转载自https://github.com/pzxwhc/MineKnowContainer/issues/25 包括:1. 栈溢出(StackOverflowError)2. 堆溢出(OutOfMemoryError:java heap space)3. 永久代溢出(OutOfMemoryError: PermGen space)4. OutOfMemoryError:unable to create native thread Java虚拟机规范规定JVM的内存分为了好几块,比如堆,栈,程序

内存溢出常见原因分析

内存溢出原因: 1.内存中加载的数据量过于庞大,如一次从数据库取出过多数据:  一般比如数据查询未做分页处理2.集合类中有对对象的引用,使用完后未清空,使得JVM不能回收: 3.代码中存在死循环或循环产生过多重复的对象实体: 4.使用的第三方软件中的BUG:                一般引用第三方jar包过多会出现此类问题5.启动参数内存值设定的过小    这种可能性很小服务器参数设置一般会出现这类问题毕竟都是开发 内存溢出的解决方案: 第一步,修改JVM启动参数,直接堆内存.(-Xms,

线上mysql内存持续增长直至内存溢出被killed分析

来新公司前,领导就说了,线上生产环境Mysql库经常会发生日间内存爆掉被killed的情况,结果来到这第一天,第一件事就是要根据线上服务器配置优化配置,同时必须找出现在mysql内存持续增加爆掉的原因,虽然我主业已经不是数据库更不是dba了. 这个业务上基本山算是OLTP,盘中都是很简单的SQL,所以性能上虽然有些SQL有些慢,但看过slow-log和performance_schema,可以忽略不计. 初步了解,应用是java开发的,但是应用端没有出现过OOM的情况,也不见卡死或者越来越慢的情

生产环境mysql内存溢出重启简单分析

思路 1. 查看数据库日志 2. 查看慢查询 3. 查看系统日志 4. 查看监控 2017-01-03 03:03:48 0 170103 03:03:45 mysqld_safe Number of processes running now: 0 170103 03:03:45 mysqld_safe mysqld restarted   --异常重启 [Note] /usr/sbin/mysqld (mysqld 5.6.25-log) starting as process 104767

(转)《深入理解java虚拟机》学习笔记2——Java内存溢出实例

通过简单的小例子程序,演示java虚拟机各部分内存溢出情况: (1).java堆溢出: Java堆用于存储实例对象,只要不断创建对象,并且保证GC Roots到对象之间有引用的可达,避免垃圾收集器回收实例对象,就会在对象数量达到堆最大容量时产生OutOfMemoryError异常. 想要方便快速地产生堆溢出,要使用如下java虚拟机参数:-Xms10m(最小堆内存为10MB),-Xmx10m(最大堆内存为10MB,最小堆内存和最大堆内存相同是为了避免堆动态扩展),-XX:+HeapDumpOnO

JVM内存监视手段和内存溢出解决方案

引言 本文仅关注一些常见的虚拟机内存监视手段,以及JVM运行时数据区各个部分内存溢出的发生和对应的解决方案,总体来说属于概括性总结,涉及相对不是很深入,目的是让自己和其它初学者有一个框架性.概念性的了解,当遇到问题时有迹可循.不至于不知所措. 一.虚拟机内存监视手段 虚拟机常出现的问题包括:内存泄露.内存溢出.频繁GC导致性能下降等,导致这些问题的原因可以通过下面虚拟机内存监视手段来进行分析,具体实施时可能需要灵活选择,同时借助两种甚至更多的手段来共同分析. 比如GC日志可以分析出哪些GC较为频