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

标签 java jvm jvm-hotspot hotspot

JVM如何翻译API它在 JVM 中的实现?

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

enter image description here

图来自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/ ) 基本上是一个普通的类库。当你安装了 JDK 后,将会有一个文件,src.zipsrc.jar,具体取决于版本,其中包含该库大部分的纯 Java 源代码。在 Java 8 及之前的所有版本中,编译后的 API 类均以普通 jar 文件形式提供,大多数 API 类位于 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 ,允许任意 native 代码和 Java 代码交互。它包括声明为原生的 Java 方法的调用及其通过 JNI 的实现之间的特殊链接。但有些方法被 JVM 作为内部操作处理,这意味着这些众所周知的方法(例如 getClass())的调用是由解释器直接处理的/optimizer 就像专用的字节码指令。当存在特定于平台的、更有效的替代方案时,这种非常有效的处理有时甚至用于具有普通 Java 实现的方法。例如,Integer.rotateLeftrotateRight有一个纯Java实现,但如果运行时实际使用的CPU有专用的按位旋转指令,所有优化的JVM都会将这些方法的调用替换为使用这些CPU指令的内部操作。

关于java - java虚拟机如何将用户级函数与其内部函数连接起来?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47621584/

相关文章:

java - Log4J文件不打印日志数据

java - Android Studio 错误 : "Environment variable does not point to a valid JVM installation"

java - JVM-XX :+StringCache argument?

java - 为什么这个代码片段在使用热点服务器 JVM 运行时实际上需要更长的时间?

java - 并行压缩收集器算法

java - 如何从现有代码生成类图和时序图?

java - SimpleDateFormat 将字符串转换为日期

java - 如何从 Java 应用程序内部获取 VM 参数?

java - 无法访问的 return 语句仍然抛出错误

java - 带有 RESTful Web 应用程序的 JDBC 模板和 AngularJS