java 虚拟机如何将用户级功能连接到其内部功能?

How does java virtual machine connect user level function to its internal functions?

JVM 如何将 API 转换为它在 JVM 内部的实现?

是否类似于"Linux Kernel syscall"实现?如果是这样,这些接口在哪里?希望能看到源码

图来自https://www.artima.com/insidejvm/ed2/introarch4.html

例如,

Any Java virtual machine implementation must take care to connect these methods of class ClassLoader to the internal class loader subsystem.

https://www.artima.com/insidejvm/ed2/jvmP.html

你链接的API(https://docs.oracle.com/javase/7/docs/api/),基本上就是一个普通的class库。当您安装了 JDK 后,将会有文件 src.zipsrc.jar,具体取决于版本,其中包含该库大部分内容的纯 Java 源代码。在 Java 8 及之前的所有版本中,编译后的 API classes 作为普通 jar 文件交付,大多数 API class在 rt.jar。从 Java 9 开始,使用了新的模块文件,但大多数 API 仍作为普通 Java 代码实现。

您甚至可以在线浏览某些版本的源代码,例如this is the implementation of Object.toString() of version 8, update 40, beta 25, hosted at grepcode.com.

因此,对于大多数方法,当您调用 API 方法时,不会涉及“类似于‘Linux 内核系统调用”的任何内容。它像普通方法调用一样工作,优化器甚至可以在运行时将 JRE 特定代码内联到您的应用程序代码中。调试的时候也可以单步进入JRE的代码。

只有少数方法没有作为纯 Java 代码实现,例如Object.getClass() 是一个 native 方法,只能以特定于 JVM 的方式实现。

有两种通用的方式来实现这些方法。有一个 standardized interface, JNI, allowing the interaction of arbitrary native code and Java code. It includes a special linkage between invocations of Java methods declared native and their implementation via JNI. But some methods are handled as intrinsic operations by the JVM instead, which implies that the invocations of these well-known methods (e.g. getClass()) is handled directly by the interpreter/optimizer like a dedicated bytecode instruction. This very efficient handling is sometimes even used for methods, which have an ordinary Java implementation, when there is a platform specific, more efficient alternative. E.g, Integer.rotateLeftrotateRight 有一个纯 Java 实现,但是如果在运行时实际使用的 CPU 有专门的按位旋转指令,所有优化 JVM 将替换调用使用这些 CPU 指令对这些方法进行内部操作。