据我了解, 通过执行
*.java
将 bytecote
文件转换为 *.class
,javac
。
一旦 JVM
实例化,JVM 组件 JIT Compiler
就会将 bytecode
转换为二进制代码。该二进制代码指令最终由 JVM
在底层架构上执行。
基于上述理解,如果我使用 apache-commons 这样的库编写代码,我需要在运行代码时传递该库 jar(
*.class
es)。
这里的问题,我还使用
JDK
内置库,例如 java.base
来进行 String
类。但我在运行 java 时从未添加过该库。
这是否意味着,对于 JDK 的内置类,
JVM
已经有了可用的二进制代码?
教育我,以防我错过理解某些东西。
这是否意味着,对于 JDK 的内置类,JVM 已经具有可用的二进制代码?
通常不需要(对于 HotSpot JVM)。
首先,你的思维模式并不完全正确。 是的,字节码通常被编译为本机代码1。但它是即时发生的。 字节码方法被字节码解释器调用并执行几次后,它们将被 JIT 编译器编译为本机代码。
JDK 的内置类的处理方式相同。 它们以字节码形式加载和解释,然后 JIT 编译为本机代码。 因此,“二进制”(本机代码)“已经”不可用。
例外:
native
。 它们具有本机代码实现,通常用 C 和 C++ 编码,并由 java
可执行文件提供。@intrinsic
。 这些可以由 JIT 编译器作为特殊情况处理。native
方法,但它们将由动态加载的本机库实现。但请注意,其中许多细节都是特定于实现的。 它们在 Hotspot 和 GraalVM 实现之间以及历史和第 3 方 Java 实现之间有所不同。
1 - 字节码也是二进制的! 二进制不是这里的区别属性。