如果Activation Record太小,但总栈还有空间,JVM会不会出现Stackoverflow?

问题描述 投票:0回答:1

每个方法都分配有自己的激活记录。现在,如果该激活记录上存在堆栈溢出,但执行线程的堆栈上仍有剩余空间,是否会发生溢出并且线程停止,或者会在堆栈上为激活记录分配更多空间? 感谢您提前的帮助:)

jvm stack stack-overflow activation-record
1个回答
0
投票

您所说的“激活记录”通常被称为激活(堆栈)帧

框架始终足够大,可以容纳其所属方法执行的所有局部变量和临时操作数值。因此,帧内不可能发生堆栈溢出。当一个方法即将被调用时,被调用方法的一个新帧将被放置在堆栈上,但如果堆栈上没有足够的空间容纳该帧,则会抛出一个StackOverflowError

可能有特殊操作将更多数据推送到堆栈。例如,在某些情况下,同步可能需要在堆栈上存储更多数据。在这种情况下,如果堆栈上没有足够的空间,则在方法执行过程中可能会出现 

StackOverflowError

但是这是否可以被视为帧扩展,而不是将额外的非帧数据推送到堆栈,这是有争议的。帧通常被视为固定大小的实体,因为它的全部要点是具有固定大小的数据结构,以消除频繁更改堆栈指针的需要。

© www.soinside.com 2019 - 2024. All rights reserved.