就没有其他方式发生堆栈溢出了吗
通过递归?
没有递归的StackOverflowError(挑战失败,见评论):
public class Test
{
final static int CALLS = 710;
public static void main(String[] args)
{
final Functor[] functors = new Functor[CALLS];
for (int i = 0; i < CALLS; i++)
{
final int finalInt = i;
functors[i] = new Functor()
{
@Override
public void fun()
{
System.out.print(finalInt + " ");
if (finalInt != CALLS - 1)
{
functors[finalInt + 1].fun();
}
}
};
}
// Let's get ready to ruuuuuuumble!
functors[0].fun(); // Sorry, couldn't resist to not comment in such moment.
}
interface Functor
{
void fun();
}
}
使用标准javac Test.java编译,并使用java -Xss104k Test 2>输出运行。在那之后,更多的信息会告诉你:
Exception in thread "main" java.lang.StackOverflowError
第二次尝试。
现在这个想法更简单了。Java中的原语可以存储在堆栈上。我们声明很多双精度数,比如双精度a1 a2 a3....这个脚本可以为我们编写,编译和运行代码:
#!/bin/sh
VARIABLES=4000
NAME=Test
FILE=$NAME.java
SOURCE="public class $NAME{public static void main(String[] args){double "
for i in $(seq 1 $VARIABLES);
do
SOURCE=$SOURCE"a$i,"
done
SOURCE=$SOURCE"b=0;System.out.println(b);}}"
echo $SOURCE > $FILE
javac $FILE
java -Xss104k $NAME
和…我得到了一些意想不到的东西:
#
# A fatal error has been detected by the Java Runtime Environment:
#
# SIGSEGV (0xb) at pc=0x00007f4822f9d501, pid=4988, tid=139947823249152
#
# JRE version: 6.0_27-b27
# Java VM: OpenJDK 64-Bit Server VM (20.0-b12 mixed mode linux-amd64 compressed oops)
# Derivative: IcedTea6 1.12.6
# Distribution: Ubuntu 10.04.1 LTS, package 6b27-1.12.6-1ubuntu0.10.04.2
# Problematic frame:
# V [libjvm.so+0x4ce501] JavaThread::last_frame()+0xa1
#
# An error report file with more information is saved as:
# /home/adam/Desktop/test/hs_err_pid4988.log
#
# If you would like to submit a bug report, please include
# instructions how to reproduce the bug and visit:
# https://bugs.launchpad.net/ubuntu/+source/openjdk-6/
#
Aborted
这是100%的重复。这和你第二个问题有关。
是否在JVM实际溢出之前发生StackOverflowError
叠完还是之后?
因此,在OpenJDK 20.0-b12的情况下,我们可以看到JVM首先爆发了。但这似乎是一个bug,也许有人可以在评论中确认,因为我不确定。我应该报告吗?也许它已经在一些更新的版本中修复了……根据JVM规范链接(由JB Nizet在评论中给出),JVM应该抛出StackOverflowError,而不是die:
如果线程中的计算需要一个更大的Java虚拟机
Java虚拟机抛出一个
StackOverflowError。
第三次尝试。
public class Test {
Test test = new Test();
public static void main(String[] args) {
new Test();
}
}
我们想要创建新的Test对象。因此,它的(隐式)构造函数将被调用。但是,在此之前,Test的所有成员都被初始化了。因此,首先执行Test Test = new Test()…
我们想要创建一个新的Test对象…
更新:运气不好,这是递归,我在这里问了一个问题。