【问题标题】:How can I check the stack limits, and accomplish Chicken Scheme style recursion in Java?如何检查堆栈限制,并在 Java 中完成 Chicken Scheme 风格的递归?
【发布时间】:2012-09-07 03:17:39
【问题描述】:

考虑以下代码。这段代码几乎实现了 Chicken Scheme 风格的递归,其中大部分时间函数是直接调用的,但偶尔会有更复杂的蹦床过程。但是,代码不能完全正常工作。我真正想要的是一个方法 stackLimitsAlmostReached,它返回一个布尔值,指示是否存在堆栈溢出的危险。如何检查堆栈限制,并在 Java 中完成 Chicken Scheme 风格的递归?

import java.util.Scanner;

public class Main {

public static abstract class Thunk {
    public abstract Thunk x();

    public final void run() {
        Thunk ip = this;

        while (ip != null)
            ip = ip.x();
    }
}

public static void main(String[] unused) {
    final Scanner scanner = new Scanner(System.in);

    new Thunk() {
        public Thunk x() {
            System.out.println("Hello World!");

            try {
                return this.x();
            } catch (StackOverflowError t) {
                System.out.println("GC!");
                scanner.nextLine();
                return this;
            }
        }
    }.run();
}
}

【问题讨论】:

  • 所以真正的问题是检查堆栈上还剩下多少空间,而与递归、Chicken 或 Scheme 无关?
  • @JimGarrison 这个问题与鸡计划无关,但我觉得鸡计划的一些爱好者(当然还有从事尾递归代码工作的开发人员)可能会有在 C 中摆弄堆栈的经验,并且还可能尝试在 Java 中完成类似的事情。特别是,我想下面的对话可能发生在互联网上遥远的 ungoogleabe 角落。 Joe:为什么不将 Chicken Scheme 移植到 Java?鲍勃:那将是很多工作,而且没有意义。另外我检查了一下,没有办法在运行时检查堆栈大小。

标签: java stack stack-overflow chicken-scheme


【解决方案1】:

嘿,我可能误解了你的问题,但我认为你必须首先寻找这些选项(Java 明智,但这不是 IMO 的问题)

-ss Stacksize to increase the native stack size or

-oss Stacksize to increase the Java stack size,

默认的本机堆栈大小为 128k,最小值为 1000 字节。默认java堆栈大小为400k,最小值为1000字节。

但我真正觉得我应该警告你的是,JVM 不能支持尾调用优化,因为它是安全模型。 Wikipedia 。 每次调用同一个函数时,都会引入一个新的堆栈帧,这就是为什么 你跑得很快。支持 TCO 的适当方案实际上不会创建新的 堆栈帧,它只是更新值并在开始时返回一个延续 当前帧。这使得递归非常有效。

即使是在 JVM 上运行的 clojure 也会遇到这个问题,这就是为什么它有一个 lambda 调用 recur 来处理该限制。 还要检查: TCO paper

【讨论】:

  • 每次函数调用自己时都会分配一个新的栈帧?那真的很糟糕。所以完全忽略堆栈溢出问题(这是我首先想要解决的问题)是否意味着调用自身的函数比使用蹦床效率低(就像 Clojure 显然那样?)
猜你喜欢
  • 1970-01-01
  • 2014-02-14
  • 2018-09-24
  • 2018-10-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-23
相关资源
最近更新 更多