你怎么知道机器的堆栈是否在内存中增长或减少?(JAVA)

Rom*_*man 8 c java

我有一个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);
}
Run Code Online (Sandbox Code Playgroud)

现在我想在Java中做同样的事情.:-)

没有编写任何本机代码,任何人都知道解决方案???

谢谢

Gre*_*ill 14

如果您没有使用任何本机代码,那么我无法想象在纯Java代码中可能存在的问题.毕竟,Java堆栈可能在任何方向上分配,而不是严格连续的内存块(如机器堆栈).

  • 只是让你意识到他的意思 - 没有规则说它必须上升*或*下降.如果您愿意,可以将每个调用帧存储在堆分配的位置,然后遍布整个地方.通过一些GC/JIT协作,您甚至可以在程序运行时移动堆栈帧.*通过消除程序员直接检查它的能力来支持这种灵活性.* (7认同)
  • "你可以将每个调用帧存储在堆分配的位置".我曾经使用过这样做的实现.实际上它并没有为每一帧进行分配,它耗尽了一个块然后链接到另一个帧.因此,在一个简单的测试中(如果有可能的话)它似乎会下降,但实际上下降了一点,然后"横向"到一个新的块,然后再次下降.原因是JVM旨在用于缺乏虚拟内存的架构.因此,为堆栈保留大的连续范围的唯一方法是为每个线程预先分配它. (2认同)

Gre*_*zky 6

Java源代码编译为Java字节代码,这是一种在JVM上运行的类似汇编的语言.JVM是一个虚拟机,所以它看起来完全一样的定义都在使用堆叠和堆栈下机.

因此,无法知道特定机器堆栈是否从Java代码增长或减少.


sig*_*ice 6

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