当前位置: 首页 > 知识库问答 >
问题:

为什么这个方法打印4?

慕弘深
2023-03-14

我想知道当您试图捕获StackOverflowError时会发生什么,并提出了以下方法:

class RandomNumberGenerator {

    static int cnt = 0;

    public static void main(String[] args) {
        try {
            main(args);
        } catch (StackOverflowError ignore) {
            System.out.println(cnt++);
        }
    }
}

现在我的问题是:

为什么这个方法打印'4'?

我想可能是因为system.out.println()在调用堆栈上需要3个段,但我不知道3这个数字来自哪里。当您查看system.out.println()的源代码(和字节码)时,通常会导致比3个多得多的方法调用(因此调用堆栈中的3个段是不够的)。如果这是因为Hotspot VM应用的优化(方法内联),我想知道在另一个VM上结果是否会有所不同。

编辑:

由于输出似乎高度特定于JVM,我使用
Java(TM)SE运行时环境(构建1.6.0_41-B02)
Java HotSpot(TM)64位服务器VM(构建20.14-B01,混合模式)得到结果4


解释为什么我认为这个问题不同于理解Java堆栈:

我的问题不是为什么会有一个cnt>0(显然是因为system.out.println()需要堆栈大小,并在打印某些内容之前抛出另一个StackOverflowError),而是为什么在其他系统上有4的特定值,分别是0、3、8、55或其他值。

共有1个答案

沈乐邦
2023-03-14

我认为其他人在解释为什么cnt>0方面做得很好,但关于为什么cnt=4以及为什么cnt在不同设置中变化如此之大还没有足够的细节。我将试图填补这里的空白。

  • x为总堆栈大小
  • m是我们第一次进入main时使用的堆栈空间
  • R是每次进入main时堆栈空间的增加
  • p为运行system.out.println所需的堆栈空间

示例1:假设

  • x=100
  • m=1
  • R=2
  • P=1

那么C=楼层((X-M)/r)=49,cnt=天花板((p-(x-m-c*r))/r)=0。

    null
  • x=101
  • m=1
  • R=5
  • P=12

然后C=20,cnt=3。

示例4:假设

    null

编辑

我终于抽出时间做了一些实验来支持我的理论。不幸的是,理论似乎与实验不符。实际发生的事情是非常不同的。

实验设置:Ubuntu 12.04服务器,缺省java和缺省-JDK。Xss从70,000开始,以1字节递增到460,000。

结果可以在以下站点获得:https://www.google.com/fusiontables/datasource?docid=1xkjhd4s8bilghe6gzbcfus3vt5mps_onscjwdbm。换句话说,只显示与前面不同的点。这样更容易看到异常。https://www.google.com/fusiontables/datasource?docid=1xg_srzrrnasepwzonhqeakuzlhiam9vbedwfsua

 类似资料:
  • 问题内容: 我想知道当您尝试捕获StackOverflowError并提出以下方法时会发生什么: 现在我的问题是: 为什么此方法打印“ 4”? 我以为是因为在调用堆栈上需要3个段,但是我不知道3的来源。当您查看的源代码(和字节码)时,通常导致的方法调用要多于3(因此,调用堆栈上的3个段是不够的)。如果是由于优化而应用了Hotspot VM(方法内联),我想知道其他VM上的结果是否会有所不同。 编辑

  • 问题内容: 我有以下代码行: 我希望看到的结果是0.555,但是它将打印出零。有人可以帮我理解为什么会这样吗?我目前正在学习编程,并感谢您的帮助。 谢谢! 问题答案: 发生这种情况是因为您在不知不觉中正在执行Integer Division。为了使计算更快,计算机在不涉及十进制数的情况下使用整数除法,因此会丢失十进制值。 试试看: 要么 要么 要么 要么

  • 我已经把一些代码放在一起,对人们的考试成绩进行排序,这样他们就可以看到他们的最高成绩是什么,以及他们什么时候达到的。我创建了以下代码,但它没有显示1、2、3等计数器,我缺少什么? 它打印以下内容,所有内容都显示1,而它应该是1、2、3等。

  • 我试图制作一个基本的C程序来读取一个文件,但由于某种原因,当我使用运行它时<代码>/Test1 Test1。txt我得到“错误:'s'可能在未初始化的情况下用于此函数”。

  • 问题内容: 我生成了x的两个矩阵: 第一矩阵:和。 第二矩阵:和。 使用以下代码,第一个矩阵花费了8.52秒完成: 使用此代码,第二个矩阵花费了259.152秒来完成: 运行时间显着不同的原因是什么? 正如评论所说,仅打印需要秒,而给。 正如其他指出它对他们正常工作的人一样,例如,我尝试了Ideone.com,这两段代码以相同的速度执行。 测试条件: 我从 Netbeans 7.2 运行了此测试,

  • 所以我有这个代码,叫我白痴哈哈,但是我不能让它打印7。 代码: 我需要知道如何改变与函数中的参数同名的变量。 任何帮助都将不胜感激,如果你不明白这个问题,我很乐意解释更多。