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

时间:2017-04-07 08:56:32

标签: java jvm classloader

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

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

2 个答案:

答案 0 :(得分:1)

基于Classloader wikipedia,JRE中有3种类型的类加载器:

  1. 引导类加载器
  

此类加载器是核心JVM的一部分,是用本机编写的   代码

  1. 扩展类加载器
  

由sun.misc.Launcher $ ExtClassLoader类实现

  1. 系统类加载器
  

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

因此,我的结论是:第一个在JVM中,另外两个在JRE库中。

  • 还有一些用户定义的类加载器,它们位于不同的位置(例如tomcat等)

答案 1 :(得分:1)

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

JRE是一种Java 发行版的名称,(偶然地)Oracle不再提供它。

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

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

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

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