【问题标题】:How does java virtual machine connect user level function to its internal functions?java虚拟机如何将用户级功能连接到其内部功能?
【发布时间】:2017-12-03 18:13:29
【问题描述】:

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 指令集,如何解释这些指令,“本机”方法如何使 Java API 适应系统相关的实现,或者 JIT 编译如何生成特定于体系结构的优化? OpenJDK 是开源的。您可以亲眼看看这一切是如何在最常用的 JRE 中完成的。
  • @erickson 感谢您构建和完善我的问题。由于我不太了解这部分,所以我的问题是“模糊的”而不是复杂的。如果我理解它,我可以提出一个明确的问题。这两部分相辅相成……
  • 您似乎在询问JNI,您可以直接查找,或者解释器如何工作,这太宽泛了。还不清楚。这不是一个图表,因为它完全忽略了解释器的存在。
  • JVM 规范故意模糊了这应该如何工作,因为他们希望将其留给 JVM 实现者来设计这些低级细节。 JVM 通过 JNI 提供对 C 方法的调用。反过来,这些 C 方法可以按照 C 进行这些调用的正常方式进行系统调用。

标签: java jvm jvm-hotspot hotspot


【解决方案1】:

您链接的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 Kernel syscall’”的内容。它像普通的方法调用一样工作,优化器甚至可以在运行时将 JRE 特定代码内联到应用程序的代码中。您也可以在调试时单步执行 JRE 的代码。

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

有两种通用方式来实现这些方法。有一个standardized interface, JNI,允许任意native代码和Java代码的交互。它包括声明为native 的Java 方法调用与其通过JNI 实现的特殊链接。但是有些方法被 JVM 作为 内在操作 处理,这意味着这些众所周知的方法(例如 getClass())的调用由解释器/优化器直接处理,就像专用的字节码指令一样.当存在特定于平台的更有效的替代方案时,这种非常有效的处理有时甚至用于具有普通 Java 实现的方法。例如,Integer.rotateLeftrotateRight 有一个纯 Java 实现,但如果在运行时使用的实际 CPU 具有用于按位旋转的专用指令,则所有优化 JVM 都会使用这些 CPU 指令将这些方法的调用替换为内部操作。

【讨论】:

  • 为什么 OpenJDK 不包含 hg clone http://hg.openjdk.java.net/jdk9/dev 的 JRE?这可能是我想念 JRE 的部分原因。
  • 源代码与 JDK 捆绑的方式早在 Java 成为开源项目之前就已经确定了,并且从未改变,因为这是现有开发工具所期望的。 Java 9 改变了一些旧的目录结构,但没有那么激进。您可能会讨论如何捆绑或部署未来的 Java 版本,但 Stackoverflow 不适合进行此类讨论。
猜你喜欢
  • 1970-01-01
  • 2014-05-12
  • 1970-01-01
  • 1970-01-01
  • 2023-03-30
  • 1970-01-01
  • 2012-12-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多