java - 关于随机数,java为什么会停止递归函数?

  显示原文与译文双语对照的内容
134 2

我编写了一个小程序,计算了一个无限递归循环将在导致a 错误之前进行多少次。

public class Testing {
 static void p(int i) {
 System.out.println("hello" + i);
 i++;
 p(i);
 }
 public static void main(String[] args) {
 p(1);
 }
}

问题是,每次在一个不同的数字上出错,通常在 8000到 9000之间。谁能解释这发生的原因?

编辑:我使用 Eclipse IDE,没有在 命令行的其他或者内部测试它。

时间:原作者:0个回答

131 3

JVM规范很好地解释了它与栈的行为

每个Java虚拟机线程都有一个 private Java虚拟机堆栈,它与线程同时创建。Java虚拟机堆栈存储帧( §2.6 ) 。Java虚拟机栈类似于传统语言的堆栈,它包含局部变量和部分结果,并在方法调用中播放。因为Java虚拟机堆栈从来没有直接操作除了推和pop框架,所以帧可以能被分配给。Java虚拟机堆栈的内存不需要是连续的。

这个规范允许Java虚拟机堆栈具有固定大小,或者根据计算的需要动态扩展和收缩。如果Java虚拟机堆栈是固定大小的,则在创建该堆栈时可以独立选择每个Java虚拟机栈的大小。

Java虚拟机实现可以帮助程序员或者用户控制Java虚拟机堆栈的初始大小。

以下异常情况与Java虚拟机堆栈相关联:

如果一个线程的运算过程需要比允许的大小更大的Java虚拟机栈,Java虚拟机抛出。

如果可以动态扩展Java虚拟机栈,但是可以使用内存不足,或者不足以创建新的Java虚拟机栈。

从这个摘录到你的问题,一个重要的问题是:

  • 这个规范允许Java虚拟机堆栈具有固定大小,或者根据计算的需要动态扩展和收缩。

由于没有提供堆栈大小,JVM尝试动态扩展堆栈大小,因为函数被递归地调用了更多堆栈内存。每次运行时,根据运行时计算机上内存的可用性,它可能会为堆栈发现不同数量的动态内存。这就是在抛出错误之前,你看到的迭代次数不同的原因。如果将( 使用 Xss<size> JVM参数) 配置为程序的一个较小的堆栈大小,那么在这个错误之前大多数是相同的recursions 。

原作者:
65 4

可以能与计算机可以分配给程序的实际内存有多少,而它的他程序和流程在计算机中运行。

原作者:
...