如何确定机器的堆栈在内存中是向上还是向下增长?(JAVA)

9

我有一个C程序,用于检查机器堆栈在内存中是向上还是向下增长。

它的实现如下:

#include <stdio .h>

void sub(int *a) {
 int b;

 if (&b > a) {
    printf("Stack grows up.");
 } else {
    printf("Stack grows down.");
 }
}

main () {
 int a;
 sub(&a);
}

现在我希望用Java实现同样的功能。 :-)

有没有人知道一个不需要编写任何本地代码的解决方案?

谢谢


顺便问一下,你为什么想用Java做同样的事情?纯粹出于好奇吗? - Joachim Sauer
没什么,我在 Google 面试时被问到了这个问题。然后面试官让我用 Java 实现它。 :-) - Roman
这段代码有问题。更多的细节请看下面我的回答。 - sigjuice
4个回答

14
如果您没有使用任何本地代码,那么我无法想象在纯Java代码中会存在可能会受到影响的情况。毕竟,Java堆栈可以在任何方向上分配内存,而不是像机器堆栈一样严格连续的内存块。

7
为了让你理解他的意思——并没有规定它必须上升或下降。如果你愿意,你可以将每个调用框架存储在堆分配的位置,并随意移动它们。通过一些垃圾回收/即时编译器(GC/JIT)的合作,甚至可以在程序运行时移动栈帧。实现这种灵活性的能力是通过剥夺程序员直接检查它的能力得到的。 - Sam Harwell
2
你可以将每个调用帧存储在堆分配的位置。我曾经使用过这种实现方式。实际上,它并没有为每个帧进行分配,而是使用了一块内存,然后链接到另一个内存块。因此,在简单的测试中(如果可能的话),它看起来会向下走,但实际上会先向下一段时间,然后“侧向”到一个新的块,然后再向下走。原因是JVM设计时考虑到了缺乏虚拟内存的架构。因此,为了为每个线程保留大量连续的堆栈空间,唯一的方法就是预先为其分配所有内存。 - Steve Jessop
我不知道这种策略是否常见,因为我只接触过这一种实现。但我们肯定没有失败任何符合性测试,所以你不能排除它的可能性。 - Steve Jessop
RISC OS(APCS-R)实现了这一点。它主要用于C语言。 - Tom Hawtin - tackline

6

Java源代码编译成Java字节码,这是一种类似汇编语言的代码,可以在JVM上运行。JVM是虚拟机,因此在使用堆栈向上和向下的机器上,它的外观将完全相同定义如此

由于这个原因,无法从Java代码知道特定机器上堆栈是向上还是向下增长。


6

这不能在Java代码中完成。在C代码中也无法完成。您发布的代码调用了未定义的行为(&b > a)。根据标准,除非指针指向同一数组中的元素,否则比较两个指针的结果是未定义的。标准没有关于堆栈增长方向或是否存在堆栈的说明。


在C语言中,没有办法确定堆栈是向上还是向下增长的吗? - Nikunj Banka

2
哇,你不可能从这样简单的Java代码中获取任何有用的信息,至少目前我所知道的情况是如此。
即使在C语言中,你现有的代码也做出了很多假设,但这些假设可能或可能不成立。这将取决于运行程序的平台和操作系统。
在Java中,你完全依赖于JVM的实现来进行寻址,因此无法这样做。
我的第一个建议是使用分析工具。你也可以使用提供的API(JVMTI)创建自己的分析代理程序。虽然这种方法比你目前的方法要复杂得多,但你应该能够获得所需的内容。
IBM的页面也可以帮到你。
这基本上就是我对这个主题的全部内容,希望能对你有所帮助。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接