JVM如何手动使用本机堆栈进行JAVA函数调用

JVM如何手动使用本机堆栈进行JAVA函数调用,java,multithreading,memory-management,jvm,operating-system,Java,Multithreading,Memory Management,Jvm,Operating System,这是关于这篇文章的答案: 它说“JVM堆栈与本机堆栈相同”,如果是这种情况,那么每当字节码中有函数调用而不是JVM代码函数调用时,JVM如何在此堆栈内存上分配堆栈帧。如果JVM代码中有函数调用,那么方法本地变量和其他与方法相关的内容将由操作系统存储在本机堆栈中。但如果字节码指令中有一个函数调用,JVM如何在本地堆栈中手动存储局部变量呢 每当字节码中有函数调用而不是jvm代码函数调用时,jvm如何在此堆栈内存上分配堆栈帧 JLS中没有指定JVM的确切内容。JVM可能会 分配堆栈帧 对叶方法重用现

这是关于这篇文章的答案:

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

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

JLS中没有指定JVM的确切内容。JVM可能会

  • 分配堆栈帧
  • 对叶方法重用现有堆栈框架
  • 内联方法,使其不需要自己的框架
就字节码而言,一个方法的不同部分可以有自己的帧,JVM可能会在一个方法中分配多个帧,尽管我怀疑它是否真的会这样做

如果JVM代码中有函数调用,那么方法本地变量和其他与方法相关的内容将由操作系统存储在本机堆栈中

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

但如果字节码指令中有一个函数调用,JVM如何在本地堆栈中手动存储局部变量呢

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

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

JLS中没有指定JVM的确切内容。JVM可能会

  • 分配堆栈帧
  • 对叶方法重用现有堆栈框架
  • 内联方法,使其不需要自己的框架
就字节码而言,一个方法的不同部分可以有自己的帧,JVM可能会在一个方法中分配多个帧,尽管我怀疑它是否真的会这样做

如果JVM代码中有函数调用,那么方法本地变量和其他与方法相关的内容将由操作系统存储在本机堆栈中

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

但如果字节码指令中有一个函数调用,JVM如何在本地堆栈中手动存储局部变量呢


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

Java虚拟机规范和Java语言规范仅将堆栈帧作为一种抽象。细节由实际实现JVM的人决定。如果您真的想在如此低的层次上理解它,那么不妨深入了解OpenJDK源代码:为什么要问这个问题?这仅仅是好奇还是有目标?Java虚拟机规范和Java语言规范仅将堆栈框架作为一种抽象来讨论。细节由实际实现JVM的人决定。如果您真的想在如此低的层次上理解它,那么不妨深入了解OpenJDK源代码:为什么要问这个问题?这只是好奇还是有目标?谢谢你的解释。这就是我所想的:JVM是底层机器的真正代码,每当JVM(在java.exe代码中)中有函数调用时,堆栈都由底层机器管理,因为它知道发生了函数调用。但是在解释字节码时,如果该字节码中有函数调用,那么如何以及谁来管理该函数调用的堆栈内容,因为只有解释JVM知道函数调用,而不知道底层机器。非常感谢您的帮助。@shyampatil堆栈只是一个具有堆栈指针的内存区域。通过向上移动指针来分配内存,通过向下移动指针来释放内存。在字节码中,所有的局部变量分配都是在编译时确定的。i、 当一个方法被输入时,它分配真正的堆栈;当它离开时,即使在解释模式下运行,它也会释放堆栈!!真是松了一口气!!非常感谢您如此精确和有价值的解释。感谢您的时间和耐心。:-)谢谢你的解释。这就是我所想的:JVM是底层机器的真正代码,每当JVM(在java.exe代码中)中有函数调用时,堆栈都由底层机器管理,因为它知道发生了函数调用。但是在解释字节码时,如果该字节码中有函数调用,那么如何以及谁来管理该函数调用的堆栈内容,因为只有解释JVM知道函数调用,而不知道底层机器。非常感谢您的帮助。@shyampatil堆栈只是一个具有堆栈指针的内存区域。通过向上移动指针来分配内存,通过向下移动指针来释放内存。在字节码中,所有的局部变量分配都是在编译时确定的。i、 当一个方法被输入时,它分配真正的堆栈;当它离开时,即使在解释模式下运行,它也会释放堆栈!!真是松了一口气!!非常感谢您如此精确和有价值的解释。感谢您的时间和耐心。:-)