内存分配,堆栈和堆栈

问题描述:

什么时候放入堆栈的函数?内存分配,堆栈和堆栈

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

OR

第一主要功能是加载到堆,然后对象在堆, 分配,然后随着对象调用它们被放入堆栈的功能,每次分配存储器到本地变量上堆栈?

并做静态方法也遵循相同的程序,就像正常的功能,因为我听说他们只分配一次内存。

所以帮我识别该程序的图形表示的是正确的......

enter image description here

enter image description here

函数是放在堆栈上。 call stack包含呼叫帧,当一个函数被调用时,一个新的呼叫帧被推送。它在函数返回时弹出。

的呼叫帧通常还含有一些引用或指针到[调用]功能的代码(即一个返回地址)通常表示为java bytecode

这是一个很常见的情况,但不是一种通用。参见旧A.Appel的编译连续书(描述没有任何堆栈的SML/NJ实现)。

+0

因此函数的定义存储在某处,堆栈包含该空间的内存地址加上局部变量的内存? – user2837260

+0

我不明白你称之为函数的定义。在我看来,函数的定义是定义它的源代码的一部分,当函数被调用时,源代码不在内存中(除了一些同形语言,但不包括Java或C++) –

+0

年。 。函数的定义就是它的作用。就像添加两个数字一样。定义x + y的部分是定义。如果它没有存储在内存中(指令是),那么函数调用什么指向 ????? – user2837260

堆栈是在运行时构建的东西。如果一个方法(不管是否静态)被调用,它的调用被放在堆栈上。如果方法结束,它将从堆栈中移除,以便调用者再次成为第一个元素并继续执行。

您可以使用调试器来观察这一点。调试器向您显示调用堆栈。如果你在你的main方法中设置了一个断点并且进入了另一个方法调用,你会发现那个方法调用是main方法之上的堆栈中的顶层元素。

何时将函数放入堆栈?

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

当它们被编译,各功能已经在堆栈上,

你在哪里读的?

,然后当一对象调用它,

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

它转到堆栈上的该功能?

没有喜欢它。

第一主要功能是加载到堆,

功能未加载在栈上。

那么对象在堆中分配,

可能,虽然他们可以在栈与逃逸分析上进行分配。

,然后作为对象调用它们被放入堆栈的功能,

线程调用方法以及当方法被调用它可任选地分配一个堆栈帧。该堆栈帧可以包含局部变量和堆栈分配的对象。

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

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

,做静态方法也遵循相同的程序,

有不同的非静态方法静态和非静态方法之间没有真正的区别会在启动该实例的附加参数。

像正常的功能,因为我听说他们只分配一次内存。

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

+0

this和[this](http:// en。wikipedia.org/wiki/Call_stack)帮助了很多.. 所以我收集的是这样的: 函数定义存储在somwewhere.when函数调用时,它被分配堆栈帧(局部变量的空间和该定义的返回地址) 但我唯一不能得到的是如何为堆栈上的局部变量分配的内存传递给定义以及什么使静态方法有任何不同 – user2837260