JVM 如何将 API 翻译为 JVM 内部的实现?
与“Linux Kernel syscall”实现类似吗?如果是的话,这些接口在哪里?希望看到源码。
图来自https://www.artima.com/insidejvm/ed2/introarch4.html
例如,
任何 Java 虚拟机实现都必须注意将类 ClassLoader 的这些方法连接到内部类加载器子系统。
您链接的API(https://docs.oracle.com/javase/7/docs/api/)基本上是一个普通的类库。当您安装了 JDK 后,将会有一个文件
src.zip
或 src.jar
(具体取决于版本),其中包含该库大部分的纯 Java 源代码。在 Java 8 及之前的所有版本中,编译后的 API 类均以普通 jar
文件形式提供,大多数 API 类位于 rt.jar
中。从 Java 9 开始,使用了新的模块文件,但大部分 API 仍然作为普通 Java 代码实现。
您甚至可以在线浏览某些版本的源代码,例如这是版本 8、更新 40、测试版 25 的
Object.toString()
的实现,托管于 grepcode.com
。
因此,对于大多数方法来说,当您调用 API 方法时,不涉及任何“类似于‘Linux 内核系统调用’”的内容。它的工作方式与普通方法调用类似,优化器甚至可以在运行时将 JRE 特定代码内联到应用程序的代码中。您还可以在调试时单步执行 JRE 的代码。
只有少数方法没有以纯 Java 代码的形式实现,例如
Object.getClass()
是一个 native
方法,只能以 JVM 特定方式实现。
实现这些方法有两种通用方法。有一个标准化接口,JNI,允许任意本机代码和 Java 代码交互。它包括声明
native
的 Java 方法的调用与其通过 JNI 的实现之间的特殊链接。但有些方法被 JVM 作为“内在操作”处理,这意味着这些众所周知的方法(例如 getClass()
)的调用是由解释器/优化器直接处理,就像专用的字节码指令一样。当存在特定于平台的更有效的替代方案时,这种非常有效的处理有时甚至用于具有普通 Java 实现的方法。例如,Integer.rotateLeft
和
rotateRight
具有纯Java实现,但如果运行时实际使用的CPU具有用于按位旋转的专用指令,则所有优化JVM将使用这些CPU指令将这些方法的调用替换为内部操作。