Java中内存异常StackOverflowError与OutOfMemoryError详解

 更新时间:2017年03月18日 11:50:35   作者:wangshuang1631  
这篇文章主要介绍了 Java中内存异常StackOverflowError与OutOfMemoryError详解的相关资料,需要的朋友可以参考下

 Java中内存异常StackOverflowError与OutOfMemoryError详解

使用Java开发,经常回遇到内存异常的情况,而StackOverflowError和OutOfMemoryError便是最常遇见的错误。
首先,看看这两种错误的解释:

如果当前线程请求的栈深度大于虚拟机所允许的最大深度,将抛出StackOverflowError异常。 如果虚拟机在扩展栈时无法申请到足够的内存空间,则抛出OutOfMemoryError异常。

这里把异常分为两种情况,但是存在一些相互重叠的地方:当栈空间无法继续分配时,到底是内存太小,还是已经使用的栈空间太大,本质上是对同一个问题的两种描述而已。

接下来,两个小例子分别展示如何产生这两种异常:

OutOfMemoryError异常:

首先设置一下虚拟机启动参数,如下:

代码如下:

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

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

错误信息入下:

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.ws.TEST1.main(TEST1.java:13)

StackOverflowError异常:

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

错误信息如下:

stack length:7585
Exception in thread "main" java.lang.StackOverflowError
  at com.ws.TEST2.stackLeak(TEST2.java:8)
  at com.ws.TEST2.stackLeak(TEST2.java:8)
  at com.ws.TEST2.stackLeak(TEST2.java:8)
  at com.ws.TEST2.stackLeak(TEST2.java:8)
  at com.ws.TEST2.stackLeak(TEST2.java:8)
  at com.ws.TEST2.stackLeak(TEST2.java:8)
  at com.ws.TEST2.stackLeak(TEST2.java:8)
  at com.ws.TEST2.stackLeak(TEST2.java:8)
  at com.ws.TEST2.stackLeak(TEST2.java:8)
  at com.ws.TEST2.stackLeak(TEST2.java:8)
......

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

相关文章

  • SpringSecurity详解整合JWT实现全过程

    SpringSecurity详解整合JWT实现全过程

    JWT作为一个开放的标准( RFC 7519 ),定义了一种简洁的,自包含的方法用于通信双方之间以Json对象的形式安全的传递信息。接下来通过本文给大家介绍springSecurity+jwt实现互踢功能,需要的朋友可以参考下
    2022-07-07
  • SpringCloud注册中心部署Eureka流程详解

    SpringCloud注册中心部署Eureka流程详解

    Eureka是Netflix开发的服务发现框架,本身是一个基于REST的服务,主要用于定位运行在AWS域中的中间层服务,以达到负载均衡和中间层服务故障转移的目的
    2022-11-11
  • java notify和notifyAll的对比

    java notify和notifyAll的对比

    这篇文章主要介绍了 java notify和notifyAll的对比的相关资料,需要的朋友可以参考下
    2017-02-02
  • Java对象的复制三种方式(小结)

    Java对象的复制三种方式(小结)

    这篇文章主要介绍了Java对象的复制三种方式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-08-08
  • java实现图的邻接表存储结构的两种方式及实例应用详解

    java实现图的邻接表存储结构的两种方式及实例应用详解

    这篇文章主要介绍了java实现图的邻接表存储结构的两种方式及实例应用详解,邻接表构建图是必须需要一个Graph对象,也就是图对象!该对象包含属性有:顶点数、边数以及图的顶点集合,需要的朋友可以参考下
    2019-06-06
  • Java与Python之间使用jython工具类实现数据交互

    Java与Python之间使用jython工具类实现数据交互

    今天小编就为大家分享一篇关于Java与Python之间使用jython工具类实现数据交互,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-03-03
  • 利用Java实现word导入导出富文本(含图片)的详细代码

    利用Java实现word导入导出富文本(含图片)的详细代码

    这篇文章主要为大家详细介绍了利用Java实现word导入导出富文本(含图片),文中的示例代码讲解详细,对大家的学习或工作有一定的帮助,感兴趣的小伙伴可以学习一下
    2024-02-02
  • SpringBoot中的Thymeleaf用法

    SpringBoot中的Thymeleaf用法

    Thymeleaf是最近SpringBoot推荐支持的模板框架。本文重点给大家介绍SpringBoot中的Thymeleaf用法,需要的的朋友参考下吧
    2017-05-05
  • MyBatis SqlSource源码示例解析

    MyBatis SqlSource源码示例解析

    这篇文章主要为大家介绍了MyBatis SqlSource源码示例解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-02-02
  • Java实现链表数据结构的方法

    Java实现链表数据结构的方法

    这篇文章主要介绍了Java实现链表数据结构的相关资料,每一个链表都包含多个节点,节点又包含两个部分,一个是数据域(储存节点含有的信息),一个是引用域(储存下一个节点或者上一个节点的地址),需要的朋友可以参考下
    2022-01-01

最新评论