类加载器是 JVM 的一部分还是 JRE 的一部分?



我对java比较陌生,所以如果这个问题看起来"愚蠢",请原谅我。我知道JVM(Java虚拟机)包含在JRE(Java运行时环境)中,但我不确定类加载器和执行引擎是否是JVM的一部分。

我读过的大多数消息来源都没有具体说明这一点。相反,在描述 JVM 的组件时,他们只讨论运行时数据区域的5 个组件(即堆、JVM 堆栈、方法区域、PC 寄存器和本机方法堆栈)。虽然我的常识告诉我,要成为一个完整的虚拟机,它需要输入、内存和处理,但我仍然需要验证这些组件的确切位置。

基于类加载器维基百科,JRE 中有 3 种类型的类加载器:

  1. 引导类装入器

这个类加载器是核心 JVM 的一部分,是用本机编写的 法典

  1. 扩展类装入器

它由 sun.misc.Launcher$ExtClassLoader 类实现

  1. 系统类装入器

这是由 sun.misc.Launcher$AppClassLoader 类实现

所以我认为总结一下:第一个在 JVM 中,另外两个在 JRE 库中。

  • 还有一些用户定义的类加载器位于不同的地方(例如Tomcat等)

我认为不可能做出明确的区分。

JRE 是一种 Java发行版的名称,(顺便说一下)Oracle 不再提供。

JVM(Java虚拟机)是一个更抽象的术语。 它指的是"执行Java程序的东西"。 实际上,它由用本机代码编写的核心和大量的Java代码组成。 但是,在虚拟机和支持虚拟机的库以及虚拟机运行的"Java的一部分"的其他库之间没有明确的界限。

java.lang.Classloader类就是一个很好的例子。 其中一些是用Java编写的。 其他部分是由 JVM 本机代码核心提供的本机代码方法。 所有其他类装入器类extendClassLoader。 有些是标准库的一部分,有些可能来自第三方库或框架,或者可能由应用程序本身实现。

然后是引导类加载器,它完全用本机代码编写,并与ClassLoader的本机代码方法共享代码。

简而言之,我认为不可能得到明确的答案。 而且我不认为尝试或成功地围绕JVM划一条强硬的界限实际上会取得任何成就。

最新更新