Classloader 是 JVM 的一部分还是在 JRE 中?
Is the Classloader part of the JVM or in the JRE?
我对 java 比较陌生,所以如果这个问题看起来像是 "Silly",请原谅我。我知道 JVM (Java 虚拟机) 包含在 JRE (Java Runtime Environment) 但我不确定类加载器和执行引擎是否是 JVM 的一部分。
我读过的大多数资料都没有具体说明。相反,在描述 JVM 的组件时,他们只讨论了 运行时数据区 的 5 个组件(即堆、JVM 堆栈、方法区、PC 寄存器和本地方法栈)。虽然我的常识告诉它要成为一个完整的虚拟机,它需要输入、内存和处理,但我仍然需要验证这些组件的确切位置。
基于 Classloader wikipedia,JRE 中有 3 种类型的 classloader:
- Bootstrap class 装载机
This class loader, which is part of the core JVM, is written in native
code
- 扩展程序class加载程序
It is implemented by the sun.misc.Launcher$ExtClassLoader class
- 系统class加载器
This is implemented by the sun.misc.Launcher$AppClassLoader class
所以我想得出结论:第一个在 JVM 中,另外两个在 JRE 库中。
- 还有一些用户定义的 classloader 位于不同的地方(例如 tomcat 等)
我认为不可能做出明确的区分。
JRE 是一种 Java 发行版 的名称,(顺便说一句)Oracle 不再提供了。
JVM(Java虚拟机)是一个比较抽象的名词。它指的是"a thing that executes Java programs"。实际上,它由一个用本机代码编写的核心和大量 Java 代码组成。但是在虚拟机和支持虚拟机的库以及虚拟机运行的其他 "part of Java" 库之间没有明确的界限。
java.lang.Classloader
class 就是一个很好的例子。有的写在Java。其他部分是 JVM 原生代码核心提供的原生代码方法。所有其他 classloader classes extend
ClassLoader
。有些是标准库的一部分,有些可能来自第三方库或框架,或者可能由应用程序本身实现。
然后是bootstrap classloader,完全用原生代码写的,和ClassLoader
的原生代码方法共享代码。
总之,我认为不可能得到一个明确的答案。而且我不认为尝试或成功围绕 JVM 划清界限实际上会取得任何成就。
我对 java 比较陌生,所以如果这个问题看起来像是 "Silly",请原谅我。我知道 JVM (Java 虚拟机) 包含在 JRE (Java Runtime Environment) 但我不确定类加载器和执行引擎是否是 JVM 的一部分。
我读过的大多数资料都没有具体说明。相反,在描述 JVM 的组件时,他们只讨论了 运行时数据区 的 5 个组件(即堆、JVM 堆栈、方法区、PC 寄存器和本地方法栈)。虽然我的常识告诉它要成为一个完整的虚拟机,它需要输入、内存和处理,但我仍然需要验证这些组件的确切位置。
基于 Classloader wikipedia,JRE 中有 3 种类型的 classloader:
- Bootstrap class 装载机
This class loader, which is part of the core JVM, is written in native code
- 扩展程序class加载程序
It is implemented by the sun.misc.Launcher$ExtClassLoader class
- 系统class加载器
This is implemented by the sun.misc.Launcher$AppClassLoader class
所以我想得出结论:第一个在 JVM 中,另外两个在 JRE 库中。
- 还有一些用户定义的 classloader 位于不同的地方(例如 tomcat 等)
我认为不可能做出明确的区分。
JRE 是一种 Java 发行版 的名称,(顺便说一句)Oracle 不再提供了。
JVM(Java虚拟机)是一个比较抽象的名词。它指的是"a thing that executes Java programs"。实际上,它由一个用本机代码编写的核心和大量 Java 代码组成。但是在虚拟机和支持虚拟机的库以及虚拟机运行的其他 "part of Java" 库之间没有明确的界限。
java.lang.Classloader
class 就是一个很好的例子。有的写在Java。其他部分是 JVM 原生代码核心提供的原生代码方法。所有其他 classloader classes extend
ClassLoader
。有些是标准库的一部分,有些可能来自第三方库或框架,或者可能由应用程序本身实现。
然后是bootstrap classloader,完全用原生代码写的,和ClassLoader
的原生代码方法共享代码。
总之,我认为不可能得到一个明确的答案。而且我不认为尝试或成功围绕 JVM 划清界限实际上会取得任何成就。