JVM 是否包含 JAVA SE 库的二进制代码

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

据我了解, 通过执行

*.java
bytecote
文件转换为
*.class
,
javac
。 一旦
JVM
实例化,JVM 组件
JIT Compiler
就会将
bytecode
转换为二进制代码。该二进制代码指令最终由
JVM
在底层架构上执行。

基于上述理解,如果我使用 apache-commons 这样的库编写代码,我需要在运行代码时传递该库 jar(

*.class
es)。

这里的问题,我还使用

JDK
内置库,例如
java.base
来进行
String
类。但我在运行 java 时从未添加过该库。

这是否意味着,对于 JDK 的内置类,

JVM
已经有了可用的二进制代码?

教育我,以防我错过理解某些东西。

java jvm
1个回答
0
投票

这是否意味着,对于 JDK 的内置类,JVM 已经具有可用的二进制代码?

通常不需要(对于 HotSpot JVM)。

首先,你的思维模式并不完全正确。 是的,字节码通常被编译为本机代码1。但它是即时发生的。 字节码方法被字节码解释器调用并执行几次后,它们将被 JIT 编译器编译为本机代码。

JDK 的内置类的处理方式相同。 它们以字节码形式加载和解释,然后 JIT 编译为本机代码。 因此,“二进制”(本机代码)“已经”不可用。

例外:

  1. 某些 JDK 内置类的方法声明为
    native
    。 它们具有本机代码实现,通常用 C 和 C++ 编码,并由
    java
    可执行文件提供。
  2. 某些 JDK 内置类的方法声明为
    @intrinsic
    。 这些可以由 JIT 编译器作为特殊情况处理。
  3. 非 JDK 类也可以有
    native
    方法,但它们将由动态加载的本机库实现。

但请注意,其中许多细节都是特定于实现的。 它们在 Hotspot 和 GraalVM 实现之间以及历史和第 3 方 Java 实现之间有所不同。


1 - 字节码也是二进制的! 二进制不是这里的区别属性。

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