`

浅谈StackOverflowError和OutOfMemoryError

阅读更多

1、栈溢出:

每当java程序启动一个新的线程时,java虚拟机会为他分配一个栈,java栈以帧为单位保持线程运行状态;

当线程调用一个方法是,jvm压入一个新的栈帧到这个线程的栈中,只要这个方法还没返回,这个栈帧就

存在,如果方法的嵌套调用层次太多(如递归调用),随着java栈中的帧的增多,最终导致这个线程的栈中的

所有栈帧的大小的总和大于-Xss设置的值,而产生生StackOverflowError溢出异常;

2、内存溢出:

2.1、栈内存溢出

java程序启动一个新线程时,没有足够的空间为改线程分配java栈,一个线程java栈的大小由-Xss设置决定;

JVM则抛出OutOfMemoryError异常;

2.2、堆内存溢出

java堆用于存放对象的实例,当需要为对象的实例分配内存时,而堆的占用已经达到了设置的最大值(通过-Xmx)设置最大值,则抛出OutOfMemoryError异常

2.3、方法区内存溢出

方法区用于存放java类的相关信息,如类名、访问修饰符、常量池、字段描述、方法描述等;在类加载器加载

class文件到内存中的时候,JVM会提取其中的类信息,并将这些类信息放到方法区中。当需要存储这些类信息,而方法区的内存占用又已经达到最大值(通过-XX:MaxPermSize);将会抛出OutOfMemoryError异常

对于这种情况的测试,基本的思路是运行时产生大量的类去填满方法区,直到溢出。
这里需要借助CGLib直接操作字节码运行时,生成了大量的动态类

分享到:
评论

相关推荐

    Java中内存异常StackOverflowError与OutOfMemoryError详解

    Java中内存异常StackOverflowError与OutOfMemoryError...StackOverflowError 和 OutOfMemoryError 是两种常见的 Java 异常,它们都是 JVM 在运行时可能遇到的问题。了解这两种异常的产生原因和解决方法是非常重要的。

    系统稳定性——StackOverFlowError常见原因及解决方法1

    本篇文章将详细探讨StackOverflowError的原因和解决方案。 StackOverflowError是由于线程的JVM栈空间耗尽而引发的错误。每个JVM线程都有自己的私有线程栈,用于存储当前线程执行的栈帧,包括被调用方法的参数、局部...

    稳定性专题 | StackOverFlowError 常见原因及解决方法

    如果某个线程的线程栈空间被耗尽,没有足够资源分配给新创建的栈帧,就会抛出 java.lang.StackOverflowError 错误。 线程栈是如何运行的? 首先给出一个简单的程序调用代码示例,如下所示: public class...

    后端-Java虚拟机了解

    同样可能出现StackOverflowError和OutOfMemoryError。 - **Java堆**:这是所有线程共享的一块内存,主要用于存储对象实例。垃圾回收主要针对堆进行。如果堆内存不足,会抛出OutOfMemoryError。 - **方法区**(JDK6...

    JsonConfigUtil

    去除死循环,解决StackOverflowError错误

    java虚拟机.pdf

    程序计数器记录当前线程执行的字节码的行号指示器,是唯一一个不会抛出 StackOverflowError 和 OutOfMemoryError 的区域。Java虚拟机栈描述了Java方法执行的内存模型,当线程创建时会分配一个栈空间,每个方法执行时...

    tomcat内存溢出解决办法,错误信息:java.lang.OutOfMemoryError:PermGen space

    tomcat内存溢出解决办法,错误信息:java.lang.OutOfMemoryError:PermGen space 参考该文档可快速解决内存溢出的问题,服务器:tomcat

    垃圾回收-GC简单总结.pdf

    常见的Error包括OutOfMemoryError和StackOverflowError。OutOfMemoryError是指Java虚拟机无法再为对象分配内存时抛出的异常;StackOverflowError则是因为线程请求栈深度超过虚拟机所允许的最大深度导致。 二、JVM...

    java内存管理详细介绍

    Java虚拟机栈可能会出现两种异常:StackOverflowError和OutOfMemoryError。前者是因为线程请求的栈深度大于虚拟机允许的最大深度;后者则是由于虚拟机可以动态扩展栈空间,当扩展时无法申请到足够的内存时抛出。 ...

    JVM内存模型及分区 JVM内存模型及分区

    - 同样可能抛出StackOverflowError和OutOfMemoryError。 4. **Java堆(Java Heap)** - 是JVM管理的最大内存区域,被所有线程共享。 - 主要用于存储对象实例和数组。 - 对象实例通常在堆上分配,但现代JVM可以...

    JVM内存模型一些简单的概述

    虚拟机栈可能出现两种异常:StackOverflowError(栈深度超过最大限制)和OutOfMemoryError(无法扩展栈空间)。 3. **本地方法栈**:与虚拟机栈类似,但它是为执行本地(非Java)方法服务的。本地方法栈的实现细节...

    JVM 32道面试题和答案.docx

    如果栈深度过大或无法扩展,会出现 StackOverflowError 或 OutOfMemoryError。 本地方法栈与虚拟机栈类似,但它服务于本地(非 Java)方法。当调用本地方法时,会在本地方法栈中处理。堆是所有线程共享的区域,用于...

    JVM内存区域划分.docx

    Java栈的异常情况包括栈深度过大导致StackOverflowError和无法扩展栈导致的OutOfMemoryError。 3. **本地方法栈(线程私有)** 本地方法栈与Java栈类似,但服务于本地(Native)方法。其具体实现细节取决于JVM,如...

    JVM核心知识学习和整理.docx

    同样可能出现StackOverFlowError和OutOfMemoryError。 4. **堆(Heap)**:这是JVM中唯一被所有线程共享的内存区域,主要用于对象实例的存储。堆被细分为新生代(包括Eden区和两个Survivor区)、老年代,以适应不同...

    JAVA的内存结构Java系列2021.pdf

    本地方法栈同样会抛出StackOverflowError和OutOfMemoryError异常。 JVM内存模型中最大的一块区域是堆。堆是所有线程共享的区域,也是垃圾收集器管理的主要区域。堆被分为新生代和老年代两个部分,新生代包含Eden...

    Java高级进阶面试题目.pdf

    4. JVM可能出现的异常主要有StackOverflowError和OutOfMemoryError。StackOverflowError发生在请求栈的深度超过虚拟机栈的最大深度时;OutOfMemoryError则可能因为请求栈内存用尽、堆内存或永久代/元空间不足、垃圾...

    JVM面试题1

    - **特点**:线程独占,可能会出现StackOverflowError和OutOfMemoryError。 3. **本地方法栈(Native Method Stack)**: - **作用**:与虚拟机栈类似,但是专门为Native方法服务。 - **特点**:线程独占,可能...

    解决返回JSON报错:HttpMessageNotWritableException: Could not write JSON: Infinite recursion (StackOverflowE

    然而,当出现"HttpMessageNotWritableException: Could not write JSON: Infinite recursion (StackOverflowError)"这样的错误时,意味着在序列化过程中遇到了无限递归的问题。这个问题通常是由于对象之间的引用循环...

Global site tag (gtag.js) - Google Analytics