【问题标题】:How Does JVM Uses Native Stack Manually For JAVA Function CallJVM如何手动使用Native Stack进行JAVA函数调用
【发布时间】:2016-12-01 00:04:18
【问题描述】:

这是参考这篇文章中的答案:How JVM stack, heap and threads are mapped to physical memory or operation system

如果是这种情况,它会说“JVM 堆栈与本机堆栈相同”,那么每当字节码中存在函数调用而不是 JVM 代码函数调用时,jvm 如何在此堆栈内存上分配堆栈帧。如果 JVM 代码中有函数调用,那么方法局部变量和其他与方法相关的东西将由操作系统存储在这个本机堆栈中。但是如果字节码指令中有函数调用,JVM如何手动将本地存储在本机堆栈中。

【问题讨论】:

  • Java 虚拟机规范和 Java 语言规范仅将堆栈帧作为一种抽象来讨论。细节留给实际实现 JVM 的人。如果你真的想在这么低的层次上理解它,不妨潜入 OpenJDK 源码:openjdk.java.net
  • 你为什么要问这个问题?只是好奇还是有目的?

标签: java multithreading memory-management jvm operating-system


【解决方案1】:

每当 Bytecode 中有函数调用而不是 JVM 代码函数调用时,jvm 如何在此堆栈内存上分配堆栈帧。

正是 JLS 中未指定 JVM 的内容。 JVM 可能

  • 分配堆栈帧。
  • 为叶方法重用现有堆栈帧。
  • 内联一个方法,因此它不需要自己的框架。

就字节码而言,方法的不同部分可以有自己的帧,JVM 可能会在一个方法中分配多个帧,尽管我怀疑它是否真的这样做。

如果 JVM 代码中有函数调用,那么方法局部变量和其他与方法相关的东西将被 OS 存储在这个本机堆栈中。

总是,除非变量被优化掉,在这种情况下它不会被存储在任何地方。

但是如果在字节码指令中有一个函数调用,JVM 是如何手动将本地变量存储在本机堆栈中的。

字节码必须在真实机器上运行,并且必须使用堆栈来存储它的信息,这不会根据它是在解释的字节码中运行还是在编译的本机代码中运行而发生显着变化。唯一的区别是在减少局部变量的数量方面进行了多少优化。

【讨论】:

  • 感谢您的解释。这就是我的想法:JVM 是底层机器的真正代码,只要 JVM 中有函数调用(在 java.exe 代码中),堆栈的东西就由底层机器管理,因为它知道发生了函数调用。但是在解释字节码时,如果该字节码中有函数调用,那么如何以及由谁来管理该函数调用的堆栈内容,因为只有解释 JVM 知道函数调用而不知道底层机器。非常感谢您的帮助。
  • @shyampatil 堆栈只是一个具有堆栈指针的内存区域。通过向上移动指针来分配内存,通过向下移动指针来释放内存。在字节码中,它具有在编译时确定的所有局部变量分配。即它在进入方法时分配实际堆栈,并在离开时释放,即使在解释模式下运行。
  • 哦!终于解脱了!!非常感谢您提供如此精确和有价值的解释。感谢您的时间和耐心。 :-)
猜你喜欢
  • 2018-02-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-05
相关资源
最近更新 更多