首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

OutOfMemoryError异常系列之虚拟机栈和本地方法栈溢出

:当栈空间无法继续分配,到底是内存太小,还是已使用栈空间太大,其本质只是对同一件事情两种描述而已; 笔者实验中,将实验范围限制于单线程中操作,尝试了下面两种方法均无法让虚拟机产生...结果:抛出StackOverflowError异常,异常出现时输出堆栈深度相应缩小。 定义了大量本地变量,增大此方法帧中本地变量表长度。...如果虚拟机进程本身耗费内存不计算在内,剩下内存就由虚拟机栈和本地方法栈“瓜分”了。每个线程分配到栈容量越大,可以建立线程数量自然就越少,建立线程就越容易把剩下内存耗尽。...这一点读者需要在开发多线程应用时特别注意,出现StackOverflowError异常时有错误堆栈可以阅读,相对来说,比较容易找到问题所在。...由于Windows平台虚拟机中,Java线程是映射到操作系统内核线程,因此上述代码执行时有较大风险,可能会导致操作系统假死。

73380

实战:OutOfMemoryError 异常(一) -- 虚拟机栈和本地方法栈溢出

单线程情况 将实验范围限制于单线程中操作,尝试了下面两种方法均无法让虚拟机产生 OutOfMemoryError 异常,尝试结果都是获得 StackOverflowError 异常。...结果:抛出 StackOverflowError 异常输出堆栈深度相应缩小。...代码如下: 注意:由于 Windows 平台虚拟机中,Java 线程是映射到操作系统内核线程执行以下代码有较大风险,可能会导致操作系统卡死。谨慎运行!...如果虚拟机进程本身耗费内存不计算在内,剩下内存就由虚拟机栈和本地方法栈“瓜分”了。每个线程分配到栈容量越大,可以建立线程数量自然就越少,建立线程就越容易把剩下内存耗尽。...开发多线程应用时特别注意,出现 StackOverflowError 异常时有错误堆栈可以阅读,相对来说,比较容易找到问题所在。

33710
您找到你想要的搜索结果了吗?
是的
没有找到

深入理解java.util.concurrent.ExecutionException: java.lang.StackOverflowError异常

当使用ExecutorService提交任务并通过Future获取结果,如果任务执行过程中抛出异常,那么将会以ExecutionException形式返回。...java.lang.StackOverflowError:它是Java虚拟机栈溢出抛出错误。当方法调用深度超过了虚拟机栈最大限制,就会抛出此错误。...现在,让我们来看看为什么并发编程中会出现java.util.concurrent.ExecutionException: java.lang.StackOverflowError异常。...,我们创建了一个执行阶乘计算任务(FactorialTask),并使用ExecutorService.submit()方法提交任务。...在这种实现中,当计算阶乘数字较大,就有可能发生栈溢出情况。栈溢出是一种典型递归调用导致错误。每当方法调用自身,虚拟机都会将当前方法状态信息(局部变量、方法参数等)保存在栈帧中。

33310

StackOverFlowError 常见原因及解决方法

,将它正在执行方法、基本数据类型、对象指针和返回包装在栈帧中,逐一压入其私有的调用栈,整体执行过程如下图所示: ?...---- 如上所述,JVM 线程栈存储了方法执行过程、基本数据类型、局部变量、对象指针和返回等信息,这些都需要消耗内存。...一旦线程栈大小增长超过了允许内存限制,就会抛出 java.lang.StackOverflowError 错误。...除了程序抛出 StackOverflowError 错误以外,还有两种定位栈溢出方法: 进程突然消失,但是留下了 crash 日志,可以检查 crash 日志里当前线程 stack 范围,以及 RSP...如果 RSP 寄存器超出这个 stack 范围,那就说明是栈溢出了。 如果没有 crash 日志,那只能通过 coredump 进行分析。

21.8K62

【面试题精讲】JVM-运行时数据区-StackOverFlowError

当一个方法被递归调用次数过多,或者方法调用层级太深,就会导致栈空间不足,从而抛出 StackOverflowError 异常。 2. 为什么会出现 StackOverflowError?...StackOverflowError 实现原理 Java 中,每个线程都有一个执行栈,用来存储方法调用信息。...StackOverflowError 示例代码 下面是一个简单递归调用示例,当递归调用次数超过一定,就会引发 StackOverflowError 异常: public class StackOverflowExample...当发生 StackOverflowError ,程序会立即终止,避免进一步执行可能导致更严重问题。 6....StackOverflowError 使用注意事项 尽量避免过深递归调用,确保方法调用层级控制合理范围内。

23040

深入理解JVM及基础面试题分析(结合多个经典博客综合整理)

当栈调用深度大于JVM所允许范围,会抛出StackOverflowError错误,不过这个深度范围不是一个恒定,我们通过下面这段程序可以测试一下这个结果: ?...虚拟机栈除了上述错误外,还有另一种错误,那就是当申请不到空间,会抛出 OutOfMemoryError。...Java 虚拟机栈会出现两种异常:StackOverFlowError 和 OutOfMemoryError。...方法执行完毕后相应栈帧也会出栈并释放内存空间,也会出现 StackOverFlowError 和 OutOfMemoryError 两种异常。 ?...多线程情况下,程序计数器用于记录当前线程执行位置,从而当线程被切换回来时候能够知道该线程上次运行到哪儿了。

60300

二、OutOfMemoryError实战

下面代码中限制Java堆大小为20MB,不可扩展(将堆最小-Xms参数与最大-Xmx参数设置为一样即可避免堆自动扩展),通过参数-XX:+HeapDump OnOutOfMemoryError可以让虚拟机在出现内存溢出异常...笔者实验中,如果将实验范围限制于单线程中操作,尝试了下面两种方法均无法让虚拟机产生OutOfMemoryError异常,尝试结果都是获得StackOverflowError异常,测试代码如下所示...结果:抛出StackOverflowError异常输出栈深度相应缩小。...这一点读者需要在开发多线程应用时候特别注意,出现StackOverflowError异常时有错误堆栈可以阅读,相对来说,比较容易找到问题所在。...所以大家记得要先保存当前工作,由于Windows平台虚拟机中,Java线程是映射到操作系统内核线程,所以上述代码执行时有较大风险,可能会导致操作系统假死。

70820

简单聊聊 Java 虚拟机栈!

操作数栈 主要作为方法调用中转站使用,用于存放方法执行过程中产生中间计算结果。另外,计算过程中产生临时变量也会放在操作数栈中。 动态链接 主要服务一个方法需要调用其他方法场景。... Java 源文件被编译成字节码文件,所有的变量和方法引用都作为符号引用(Symbilic Reference)保存在 Class 文件常量池里。...栈空间虽然不是无限,但一般正常调用情况下是不会出现问题。不过,如果函数调用陷入无限循环的话,就会导致栈中被压入太多栈帧而占用太多空间,导致栈空间过深。...除了 StackOverFlowError 错误之外,栈还可能会出现OutOfMemoryError错误,这是因为如果栈内存大小可以动态扩展, 如果虚拟机动态扩展栈无法申请到足够内存空间,则抛出...简单总结一下程序运行中栈可能会出现两种错误StackOverFlowError: 若栈内存大小不允许动态扩展,那么当线程请求栈深度超过当前 Java 虚拟机栈最大深度时候,就抛出 StackOverFlowError

39520

@Data注解导致StackOverflowError

《Java虚拟机规范》中描述了这两种异常: 1)如果线程请求栈深度大于虚拟机所允许最大深度,将抛出StackOverflowError。...通过查看执行log,发现TreeDTO.hashCode()方法循环抛出异常,也即出现了死循环。...@Data,而且这里出现了集合间包含自身递归引用。...这个哈希码作用是确定该对象哈希表中索引位置。如果两个对象equals()方法是相等,那么调用二者各自hashCode()方法必须产生同一个int结果。 为什么会出现该异常?...先计算一遍,如果这些子元素中某一个或子元素子元素引用到上级对象,那么hashCode方法就会出现无限递归调用,最终出现StackOverflowError错误

13010

JVM-01Java内存区域与内存溢出异常()【运行时区域数据】

执行java方法,程序计数器是有,且记录是正在执行字节码指令地址 执行native本地方法,程序计数器为空(Undefined)。...程序计数器占用内存很小,进行JVM内存计算,可以忽略不计 程序计数器是唯一一个java虚拟机规范中没有规定任何OutOfMemoryError区域。...后进先出(LIFO)栈 存储栈帧,支撑java方法调用执行和退出 可能出现OutOfMemoryError异常和StackOverflowError异常 ---- 可能抛出异常 虚拟机栈StackOverflowError...若单个线程请求栈深度大于虚拟机允许深度,则会抛出StackOverflowError(栈溢出错误)。...服务器管理人员配置虚拟机参数,会根据实际内存设置-Xmx等信息参数信息,但经常忽略直接内存,使各个内存区域总和大于物理内存限制从而导致动态扩展出现OutOfMemoryError异常。

35540

Java虚拟机OOM之虚拟机栈和本地方法栈溢出(4)

一、 Java 虚拟机规范中,对虚拟机栈这个区域规定了两种异常状况: (1)如果线程请求栈深度大于虚拟机所允许深度,将抛出StackOverflowError 异常; (2)如果虚拟机栈可以动态扩展...要设置VM Args: -Xss128k(一篇已经说到:设置栈为128k),结果如下: stack length:40550Exception in thread "main" java.lang.StackOverflowError...结果表明:单个线程下,无论是由于栈帧太大,还是虚拟机栈容量太小,当内存无法分配时候,虚拟机抛出都是 StackOverflowError 异常,而不是OOM。...自己可以创建多个线程,进行测试,但是:由于Windows 平台虚拟机中, Java 线程是映射到操作系统内核线程,所以多线程代码执行时有较大风险,可能会导致操作系统假死。所以。。。...如果虚拟机进程本身耗费内存不计算在内,剩下内存就由虚拟机栈和本地方法栈“瓜分”了。每个线程分配到栈容量越大,可以建立线程数量自然就越少,建立线程就越容易把剩下内存耗尽。

74130

Java内存管理-JVM内存模型以及JDK7和JDK8内存模型对比总结(三)

但是由于内存申请和释放都交给了Java虚拟机,一旦出现内存泄漏和溢出问题不了解Java虚拟机内存结构和自动管理机制情况下,就很难排查问题所在。...JVM规范中规定,如果线程执行是非native方法,则程序计数器中保存是当前需要执行指令地址;如果线程执行是native方法,则程序计数器中是undefined。...想想一个线程执行方法过程中,实际就是不断执行语句过程,而归根到底就是进行计算过程。因此可以这么说,程序中所有计算过程都是借助于操作数栈来完成。...Local Allocation Buffer),其大小由JVM根据运行情况计算而得,TLAB分配对象不需要加锁,因此JVM在给线程对象分配内存时会尽量TLAB分配,在这种情况下JVM...、OutOfMemoryError | StackOverflowError:线程请求栈深度大于虚拟机所允许最大深度;OutOfMemoryError:虚拟机扩展栈无法申请足够内存空间 | |

1.4K20

JVM 内存结构基于JDK1.8【JVM篇三】

Java虚拟机规范中是这样定义方法区: 它存储了每个类结构信息,例如运行时常量池、字段、方法数据、构造函数和普通方法字节码内容,还包括一些类、实例、接口初始化时用到特殊方法。...元空间放置于本地内存中,因此元空间最大空间就是系统内存空间了,从而不会再出现像永久代内存溢出错误了,也不会出现泄漏数据移到交换区这样事情。...,不要再经常出现这样 OOM错误。...2、Java 虚拟机栈描述是 Java 方法执行内存模型:每一个方法执行同时都会创建一个栈帧,用于存储局部变量表、操作数栈、动态链接、方法出口等信息,每一个方法从调用直至执行完成过程,就对应着一个栈帧...2、栈容量超过 Java 虚拟机栈最大容量,会抛出 StackOverflowError 异常;也就是栈溢出错误

68022

一问带你彻底了解JVM-Java内存区域详解

字节码解释器工作通过改变这个计数器来选取下一条需要执行字节码指令;它是程序控制 流指示器。分支、循环、跳转、异常处理、线程恢复等功能都需要这个计数器来协助完成。...(Slot)来表示 操作数栈:主要是作为方法调用中转站使用,用于存放方法执行过程中产生中间计算结果,另外计算过程中产生临时变量也会存在操作数栈中 动态链接:主要是服务一个方法需要调用其它方法,...错误,这是因为栈内存大小可以动态扩展,如果虚拟机动态扩展却无法申请到足够内存空间,则会抛出OutOfMemoryError异常 综上所述:栈可能会出现两种错误 StackOverflowError...方法执行完毕后相应栈帧也会弹出并释放内存空间,同时也会出现StackOverflowError和OutOfMemoryError两种错误 堆 Java虚拟机所管理内存中最大一块,Java堆使所有线程共享一块内存区域...heap space:假如在创建新对象,堆内存空间不足以存放该新对象,就会发生次错误

32010

【Java】Java中栈溢出常见情况

Java编程中,栈溢出(StackOverflowError)是一个常见错误,通常发生在递归调用过深、大量方法调用、无限循环以及线程过多等情况下。...这种错误通常发生在递归调用层次过深,超出了栈空间容量,导致程序无法继续执行。 递归函数通常会在每次调用时将当前状态保存到栈中,并在递归结束从栈中恢复状态。...大量方法调用或者局部变量 栈溢出错误StackOverflowError)经常源于大量方法调用或者每个方法中存在大量局部变量。...Java中,每个线程都拥有自己栈空间,用于存储方法调用、局部变量和部分对象引用。当程序调用一个方法,会在栈分配一定内存空间,用于存储方法参数、局部变量和返回地址等信息。...当方法调用次数过多时,栈空间可能会被耗尽,导致栈溢出错误发生。 3. 循环递归 无限递归循环中缺少适当终止条件,或者终止条件永远不被满足,会导致递归无限进行,最终耗尽栈空间,触发栈溢出错误

7610

八股文之【JVM内存结构】

;所以程序计数器主要作用是记录线程运行时状态,方便线程被唤醒能从上一次被挂起状态继续执行,需要注意是,程序计数器是唯一一个 Java 虚拟机规范中没有规定任何 OOM 情况区域,所以这块区域也不需要进行...JVM 通过索引定位方式使用局部变量表,索引范围从0开始至局部变量表中最大 Slot 数量。普通方法与 static 方法第 0 个槽位存储有所不同。...2、操作数栈 当帧被创建,操作数栈是空,jvm提供一些指令用于加载常量值,本地变量值,字段到操作数栈,另一些jvm指令采用操作数栈操作数进行操作,并把结果放回到操作数栈。...操作数栈也用于准备将要传递给方法调用参数和接收方法调用返回结果。 long和double类型占用两个单位栈深度,其它类型占用一个单位栈深度。 栈中可能出现哪些异常?...StackOverflowError:栈溢出错误 如果一个线程计算所需要用到栈大小 > 配置允许最大栈大小,那么Java虚拟机将抛出 StackOverflowError OutOfMemoryError

50120

JVM 内存区域划分详解

它能识别 .class 后缀文件, 并且能够解析它指令, 最终调用操作系统函数, 完成我们想要操作。...JVM 来具体执行, 所以程序计数器不需要记录了, 这个是因为操作系统层面也有一个程序计数器,这个会记录本地代码执行地址, 所以执行 native 方法, JVM 中程序计数器为(Undefined...除了 StackOverFlowError 错误之外,栈还可能会出现OutOfMemoryError错误,这是因为如果栈内存大小可以动态扩展, 如果虚拟机动态扩展栈无法申请到足够内存空间,则抛出...简单总结一下程序运行中栈可能会出现两种错误StackOverFlowError: 若栈内存大小不允许动态扩展,那么当线程请求栈深度超过当前 Java 虚拟机栈最大深度时候,就抛出 StackOverFlowError...方法执行完毕后相应栈帧也会出栈并释放内存空间,也会出现 StackOverFlowError 和 OutOfMemoryError 两种错误

28520

线程与栈那些事

Java 线程栈溢出是如何处理 前面介绍过,Linux 线程通过 4k Guard 区域实现了栈溢出简单预防,只要读写 Guard 区域就会出现错误。...那有没有想过 Java 是如何处理栈溢出呢? Java 线程栈溢出,进程不会退出,StackOverflowError 异常还可以被捕获,程序可以继续运行,以下面的代码为例。...variations here if (sig == SIGSEGV) { address addr = (address) info->si_addr; // 检查发生段错误地址是不是栈内存有效范围内...这是一个比较有意思问题,之前也没有怎么多想过,只知道默认栈大小为 1M,那我们随便试一下: 可以看到 64 位 Centos7 系统,这个为栈大小最小要指定 228k,这个怎么来呢?... Xss 最小为 160k,它计算规则有一点不太一样,源码如下: os::Bsd::min_stack_allowed = MAX2(os::Bsd::min_stack_allowed,

62710

jvm内存结构

当然也有特殊情况,我们知道普通对象会被分配在TLAB,如果对象较大,JVM会试图直接分配在Eden其他位置,如果对象太大,无法新生代找到足够长连续空间,JVM会直接分配在老年代 过早提升(Premature...4)方法出口等 方法从调用到执行完成过程,就对应了,一个栈帧虚拟机栈中入栈和出栈过程 有两种异常: 如果线程请求栈深度大于JVM所允许深度,将抛出StackOverflowError异常 如果栈扩展无法申请到足够内存...关于虚拟机栈和本地方法栈,Java虚拟机规划中描述了两种异常: 如果线程请求栈深度大于虚拟机所允许最大尝试,将抛出抛出StackOverflowError异常 如果虚拟机扩展栈无法申请到足够内存空间...所以多线程开发应用时需要特别注意,如果出现StackOverflowError异常时有错误堆栈可以阅读,相对来说,比较容易找到错误问题所在。...* 由于Windows平台虚拟机中,Java线程是映射到操作系统内核线程, * 因此上述代码执行时有较大风险,可能会导致操作系统假死。

72720
领券