`

浅谈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 在运行时可能遇到的问题。了解这两种异常的产生原因和解决方法是非常重要的。

    如何解决java.lang.StackOverflowError

    在设计和优化程序时,必须确保线程的内存需求不会超出分配的栈空间,否则可能会触发`StackOverflowError`。通过合理设置`-Xss`并优化代码,可以有效地避免这类问题。 总的来说,解决`java.lang.StackOverflowError`...

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

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

    StackOverflowError如何解决.md

    StackOverflowError如何解决.md

    StackOverflowError解决办法.md

    StackOverflowError解决办法.md

    StackOverflowError(解决方案).md

    StackOverflowError(解决方案).md

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

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

    StackOverflowError.md

    项目中碰到的,记录一下

    后端-Java虚拟机了解

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

    java.lang.StackOverflowError(解决方案).md

    项目中碰到的,记录一下解决方案

    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。前者是因为线程请求的栈深度大于虚拟机允许的最大深度;后者则是由于虚拟机可以动态扩展栈空间,当扩展时无法申请到足够的内存时抛出。 ...

Global site tag (gtag.js) - Google Analytics