文章目录

  • 1. 模拟堆内存溢出
  • 2. 模拟栈内存溢出

1. 模拟堆内存溢出

为了更快的出现堆内存溢出,可以限制Java堆的大小为10MB(不限制也可以)。代码如下(可直接复制使用):

package test.oom;import java.util.ArrayList;
import java.util.List;// VM Args:-Xms10m -Xmx10m
public class HeapOOM {static class OOMObject {}public static void main(String[] args) {List<OOMObject> list = new ArrayList<>();while (true) {list.add(new OOMObject());}}
}

运行结果:

Exception in thread "main" java.lang.OutOfMemoryError: Java heap spaceat java.base/java.util.Arrays.copyOf(Arrays.java:3511)at java.base/java.util.Arrays.copyOf(Arrays.java:3480)at java.base/java.util.ArrayList.grow(ArrayList.java:237)at java.base/java.util.ArrayList.grow(ArrayList.java:244)at java.base/java.util.ArrayList.add(ArrayList.java:454)at java.base/java.util.ArrayList.add(ArrayList.java:467)at test.oom.HeapOOM.main(HeapOOM.java:14)Process finished with exit code 1

当申请不到堆内存,总容量触及最大堆的容量限制后就会产生堆内存溢出异常。Java堆内存的OutOfMemoryError异常是实际应用中最常见的内存溢出异常情况。出现Java堆内存 溢出时,异常堆栈信息“java.lang.OutOfMemoryError”会跟随进一步提示“Java heap space”。

要解决这个内存区域的异常,常规的处理方法是首先通过内存映像分析工具(如Eclipse Memory Analyzer)对Dump出来的堆转储快照进行分析。首先应确认内存中导致OOM的对象是否是必要的,也就是要先分清楚到底是出现了内存泄漏(Memory Leak)还是内存溢出(Memory Overflow)。如果是内存溢出且代码没问题,就需要扩大堆内存;如果是内存泄漏一般需要查看自己代码。

2. 模拟栈内存溢出

模拟栈内存溢出,可以参考如下代码(可直接复制使用):

package test.oom;public class StackOOM {private int stackLength = 1;public void stackLeak() {stackLength++;stackLeak();}public static void main(String[] args) throws Throwable {StackOOM oom = new StackOOM();try {oom.stackLeak();} catch (Throwable e) {System.out.println("stack length:" + oom.stackLength);throw e;}}
}

运行结果:

stack length:16073(机器和配置不同,这个值会不同)
Exception in thread "main" java.lang.StackOverflowErrorat test.oom.StackOOM.stackLeak(StackOOM.java:8)at test.oom.StackOOM.stackLeak(StackOOM.java:8)......(省略了相同的日志)at test.oom.StackOOM.stackLeak(StackOOM.java:8)at test.oom.StackOOM.stackLeak(StackOOM.java:8)Process finished with exit code 1

可以看到出现了StackOverflowError,关于虚拟机栈和本地方法栈,在《Java虚拟机规范》中描述了两种异常:
2.1 如果线程请求的栈深度大于虚拟机所允许的最大深度,将抛出StackOverflowError异常。
2.2 如果虚拟机的栈内存允许动态扩展,当扩展栈容量无法申请到足够的内存时,将抛出 OutOfMemoryError异常。
这个例子是栈深度大于虚拟机所允许的最大深度,方法执行是利用栈来实现的。

模拟JAVA堆内存溢出和栈内存溢出相关推荐

  1. java堆是gc管理_JVM内存管理及GC机制

    一.概述 JavaGC(Garbage Collection,垃圾收集,垃圾回收)机制,是Java与C++/C的主要区别之一,作为Java开发者,一般不需要专门编写内存回收和垃圾清理代码,对内存泄露和 ...

  2. 堆内存(heap)和栈内存(stack)区别

    栈内存:   在函数中定义的一些基本类型的变量和对象的引用变量都在函数的栈内存中分配. 栈内存主要存放的是基本类型类型的数据 如.( int, short, long, byte, float, do ...

  3. java栈的内存_JVM的栈内存

    每当启动一个新线程时,Java虚拟机都会为它分配一个Java栈.Java栈以帧为单位保存线程的运行状态.虚拟机只会直接对Java栈执行两种操作:以帧为单位的压栈和出栈. 某个线程正在执行的方法被称为该 ...

  4. java线程多栈会溢出_JVM 栈(stack)溢出案例

    介绍 当启动一个新线程时,JVM就会给这个线程分配一个Java栈(这个栈的内存大小由-Xss参数来设置). 一个Java栈的基本单位是帧,每一次函数调用就会生成栈帧,占用一定的栈空间.当函数本身需要的 ...

  5. 46栈内存溢出、内存区域(程序计数器、Java 虚拟机栈、本地方法栈、Java 堆、方法区、直接内存、内存溢出)与内存溢出(对象实例化分析)

    46.什么情况下会发生栈内存溢出 46.1.Java 内存区域与内存溢出 46.1.1.内存区域 46.1.1.1.程序计数器 46.1.1.2.Java 虚拟机栈 46.1.1.3.本地方法栈 46 ...

  6. Java 堆内存和栈内存

    在Java中,内存:栈内存.堆内存. 1 栈内存 栈内存主要是用来执行程序用的,比如:基本类型的变量和对象的引用变量 栈溢出(StackOverflowError) 递归溢出 2 堆内存 堆内存作用是 ...

  7. Java堆、栈、内存分析

    在 JAVA 中,有六个不同的地方可以存储数据: 1. 寄存器( register ).这是最快的存储区,因为它位于不同于其他存储区的地方--处理器内部.但是寄存器的数量极其有限,所以寄存器由编译器根 ...

  8. java 内存堆和栈_java中堆内存与栈内存的知识点总结

    一.概述 在Java中,内存分为两种,一种是栈内存,另一种就是堆内存. 二.堆内存 1.什么是堆内存? 堆内存是Java内存中的一种,它的作用是用于存储Java中的对象和数组,当我们new一个对象或者 ...

  9. 简述JAVA中堆内存与栈内存的区别

    Java把内存划分成两种:一种是栈内存,一种是堆内存. 一.栈内存 存放基本类型的变量,对象的引用和方法调用,遵循先入后出的原则. 栈内存在函数中定义的"一些基本类型的变量和对象的引用变量& ...

最新文章

  1. Asp.Net.Core 系列-中间件和依赖注入进阶篇
  2. 《PHP和MySQL Web开发从新手到高手(第5版)》一2.9 删除存储的数据
  3. elastic-job的原理简介和使用
  4. 没错,那帮实习生什么都做不好
  5. 信元模式mpls 避免环路_呼吸机常见通气模式及参数调节
  6. Java+大数据开发——Hadoop集群环境搭建(二)
  7. 【HAOI2015】按位或【Min-Max容斥】【FWT】
  8. 使用Java第2部分查询DynamoDB项
  9. stl向量_如何检查C ++ STL中向量中是否存在元素?
  10. 10参数_荣耀V40屏幕参数:10亿色视网膜级超感屏
  11. yum源中repodata目录下的各文件内容及作用-转载
  12. CacheCloud详解(一)----------CacheCloud搭建(Redis云平台)
  13. CwRsync | Windows与Windows之间同步备份配置详解
  14. 搜狗推送接口-搜狗推送推送工具
  15. 计算机设备选型原则,计算机中通信技术的选用应遵循什么原则
  16. 嵌入式主板在数控机床领域的应用
  17. java读取文件并输出内容
  18. java jcr使用_java – 什么时候使用JCR(内容存储库)超过其他选项?
  19. 我的世界java萌新须知_我的世界新手入门攻略 萌新前期注意事项
  20. Swagger学习笔记(基于Go-Gin)

热门文章

  1. 视频智能生产及内容分析应用工具开源了!​
  2. 你想知道的工程师职称评审申报的那些事
  3. 【机器学习】主成分分析法
  4. Java RMI、JRMP详解
  5. pytorch深度学习参加平安银行数据大赛,从驾驶行为预测驾驶风险
  6. c# WPF listbox右键鼠标处弹出快捷菜单
  7. 高等数学 第八章 向量代数和空间解析几何
  8. 根据物联网与互联网的关系,主要可以分为哪几种类型
  9. android 图片轮播带缩略图,超酷响应式带缩略图的jQuery轮播图插件
  10. 遇到卸磨杀驴的老板怎么办?和老板两个人从无到有创业,自己累死累活,团队越来越大,结果最近因为业务萎缩要优化我!...