java虚拟机如何将用户级函数与其内部函数连接起来?

问题描述 投票:0回答:1

JVM 如何将 API 翻译为 JVM 内部的实现?

与“Linux Kernel syscall”实现类似吗?如果是的话,这些接口在哪里?希望看到源码。

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

例如,

任何 Java 虚拟机实现都必须注意将类 ClassLoader 的这些方法连接到内部类加载器子系统。

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

java jvm jvm-hotspot
1个回答
3
投票

您链接的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指令将这些方法的调用替换为内部操作。
    

© www.soinside.com 2019 - 2024. All rights reserved.