概念检查:Java';s仅堆内存分配模型不支持';这并不意味着它没有函数调用堆栈,对吗?

概念检查:Java';s仅堆内存分配模型不支持';这并不意味着它没有函数调用堆栈,对吗?,java,memory-management,Java,Memory Management,我对这里“绝对”的程度有点困惑 < >我知道C++中的内存分配可以通过堆或堆栈来完成。 我知道Java的内存分配只能通过堆来完成 基本上,以下是正确的吗 “Java没有基于堆栈的内存分配[程序员可以直接访问]”不应该与“Java仍然使用函数调用堆栈来实现函数调用,就像其他语言一样” 我认为程序员可以直接访问它。不能在堆栈上放置数组,但可以声明局部变量,无论是基元还是引用。例如: static void foo(double baz) { int foo = ...; JFrame ba

我对这里“绝对”的程度有点困惑

< >我知道C++中的内存分配可以通过堆或堆栈来完成。 我知道Java的内存分配只能通过堆来完成

基本上,以下是正确的吗

“Java没有基于堆栈的内存分配[程序员可以直接访问]”不应该与“Java仍然使用函数调用堆栈来实现函数调用,就像其他语言一样”


我认为程序员可以直接访问它。不能在堆栈上放置数组,但可以声明局部变量,无论是基元还是引用。例如:

static void foo(double baz)
{
  int foo = ...;
  JFrame baz = ...;
}
foo、bar和baz都放在堆栈上(而JFrame对象放在堆上)


您是对的,它使用的堆栈框架与大多数语言非常相似。事实上,JVM本身是面向堆栈的,这意味着操作在堆栈的顶部(而不是寄存器的内容)工作。例如,
ladd
弹出最上面的两个堆栈元素,添加它们,然后推送结果。我们不应该忘记我们的老朋友

Java将本地原语保存在调用堆栈上。所以,并不是所有的东西都在堆上


C++ java内存模型的主要区别在于java不能选择保存对象的地方,Java决定了你。

java确实有函数调用栈,即使所有内存分配都发生在堆上。这里有一个例子

static LinkedList<Object> foo(int x)        // x is pushed onto the stack
{
    int y = x;                // this is a basic data type, so it goes on the stack
    Object o = new Object();  // the Object is in the heap, but the pointer to it is on the stack
    List<Object> xs = new LinkedList<Object>();  // ditto
    xs.append(o);             // a copy of the pointer to my object is now in the LinkedList on the heap
    return xs;                // the pointer to the structure is returned through the stack
}
staticlinkedlist foo(intx)//x被推送到堆栈上
{
int y=x;//这是一种基本数据类型,因此它位于堆栈上
Object o=new Object();//对象在堆中,但指向它的指针在堆栈上
List xs=new LinkedList();//同上
xs.append(o);//指向我的对象的指针的副本现在位于堆上的LinkedList中
return xs;//指向结构的指针通过堆栈返回
}

谢谢,这正是我理解的方向。说“Java只是堆”的人过于简化了。不仅是本地原语,还有对对象的引用。但是对象本身总是在堆中分配的,Java也可以决定在堆栈上分配对象,如果它确定对象永远不会逃脱当前的函数调用。不过,截至上述评论发表之时,这可能尚未实施。