内存分配,堆栈和堆

时间:2013-10-02 07:04:31

标签: java

什么时候把功能放在堆栈上?

比如,当它们被编译时,每个函数都被放在堆栈上,然后当一个对象调用它时,它会转到堆栈上的那个函数吗?

OR

首先将main函数加载到堆栈中,然后在堆中分配对象, 然后当对象调用函数时,它们被放入堆栈,每次都将内存分配给堆栈上的本地变量?

并且静态方法也遵循相同的过程,就像正常的函数一样,因为我听说它们只被分配了一次内存。

所以请帮我确定一下这个节目的图形表示是否正确......

enter image description here

enter image description here

3 个答案:

答案 0 :(得分:3)

函数放在堆栈上。 call stack包含调用帧,并且在调用函数时,会推送新的调用帧。它在函数返回时弹出。

调用帧通常还包含一些引用或指向[调用]函数代码的指针(即返回地址),通常表示为java bytecode

这是一种非常常见的情况,但不是普遍情况。请参阅旧A.Appel的 Compiling with Continuations 一书(描述没有任何堆栈的SML / NJ实现)。

答案 1 :(得分:1)

  

什么时候把功能放在堆栈上?

堆栈包含数据,而不是函数。为函数预先分配空间是没有意义的,因为它可以递归调用,或者根本不调用。

  

编译时,每个函数都放在堆栈中,

你在哪里读到这个?

  

然后当一个对象调用它时,

线程运行代码,而不是对象。

  

它会转到堆栈上的那个函数吗?

没有比它更好的了。

  

首先将main函数加载到堆栈中,

函数未加载到堆栈中。

  

然后在堆中分配对象,

可能,虽然它们可以通过转义分析在堆栈上分配。

  

然后当对象调用函数时,它们被放到堆栈中,

线程调用方法,当调用方法时,它可以选择分配堆栈帧。该堆栈帧可以包含局部变量和堆栈分配的对象。

  

每次将内存分配给堆栈上的本地变量?

每个方法调用都可以为使用内存的所有局部变量分配单个内存块。注意:一些局部变量可以分配给寄存器,也可以不使用堆栈。

  

并且静态方法也遵循相同的步骤,

静态和非静态方法之间没有真正的区别,除非非静态方法在实例的开头有一个额外的参数。

  

和普通函数一样,因为我听说它们只被分配了一次内存。

方法每次调用只分配一次。假设你有一个包含局部变量的循环,它仍然只会被分配一次。

答案 2 :(得分:0)

堆栈是在运行时构建的。如果一个方法(无论是否静态)被调用,它的调用就被放在堆栈上。如果方法完成,它将从堆栈中删除,以便调用者再次成为第一个元素并继续执行。

您可以使用调试器来观察此情况。调试器显示调用堆栈。如果在main方法中设置断点并进入另一个方法调用,您将看到该方法调用是main方法上方堆栈中的顶部元素。