在Java中调用方法后会发生什么

这看起来像一个愚蠢的问题,但我发现很难做到这一点。 我问过不同的人,但无法得到理想的答案。

我想知道在Java中调用常规方法(在单线程环境中提供)后会发生什么。

我的理解是:

  • 所有当前的堆栈变量都被加载并存储在某处(其中?)
  • 当前方法调用暂停
  • 新调用的方法的参数被推送到堆栈
  • 方法代码运行
  • 方法完成运行后,堆栈将再次清空,旧的堆栈内容将再次恢复。 (如果函数返回一个值会发生什么?)。
  • 代码继续调用方法。
  • 这是一个非常不完整,可能是错误的答案。 有人可以提供更详细的描述吗?

    非常感谢。


    不,这实际上相当准确:

    1)当前堆栈变量保留在堆栈上

    2)当前方法暂停

    3)新调用的方法的参数被推送到堆栈

    4)方法代码运行

    5)方法完成运行后,我们弹出堆栈。 被调用方法的堆栈变量不再有效 - 此时它们不再“存在”。

    6)我们将返回值(如果有)传递给调用者

    7)代码继续调用方法。 所有的堆栈变量保持不变。

    ==============================

    附录:

    @凯文 -

  • 从概念上讲,我认为你是对的。 我澄清了几点,我希望有所帮助。

  • 如果您想深入了解JVM如何实现“方法调用”,David Wallace的链接非常好。

  • 这是一个很好的概述“堆栈”是如何工作的。 任何堆栈,调用任何子程序 - 不只是Java:http://en.wikipedia.org/wiki/Call_stack

  • 最后,Marko Topolnik是正确的。 “现实”几乎总是非常复杂,以至于它不适用于一个简单的,一刀切的答案。 但我绝对认为你的理解是好的。 至少在10,000英尺的水平。

  • 恕我直言...


    对于翻译,假设一个实例方法,并采取一些小的自由:

  • 对象指针用于引用对象,并从那里引用Class对象。
  • 方法指针位于Class对象中。 (将方法名称转换为方法索引的查找大部分是在加载类时完成的,所以这基本上只是一个数组索引操作。)
  • 通常,某种“标记”被推送到JVM堆栈上。 这将包含调用者的指令指针和一个指向其堆栈底部的指针。 (这里有很多不同的实现。)
  • 查看方法的定义以查看需要多少局部变量。 许多空白元素被压入堆栈。
  • 对象(“t​​his”)指针存储在本地var 0中,并且任何parms都存储在1,2,3 ...中。
  • 控制转移到被调用的方法。
  • 在返回时,堆栈被弹出到开始调用的位置,任何返回值被压入堆栈,并且控制权被转回给调用者。

    编译代码在概念上是相似的,只有它使用“C”堆栈,并且JITC环境中的解释代码将使用JVM堆栈和“C”堆栈。

    链接地址: http://www.djcxy.com/p/75725.html

    上一篇: What happens after a method is called in Java

    下一篇: OpenLdap (Centos 5.9): Invalid credentials (49)