在 Java 中有 3 个 Class 装载机的原因是什么
What is the reason for having 3 Class loaders in Java
Java 有 3 个 class 装载机:
- BootStrap,
- 扩展和
- 系统
他们只有一个角色;从不同的包中加载 classes。
但是为什么 Java 有 3 个不同的 class 加载器而不是只有一个,因为一个 class 加载器可以加载所有必要的 classes?
class 加载器的主要用途是在应用程序服务器中。
您希望能够开始Tomcat(例如)。这已经需要至少一个 classloader 到 运行 tomcat 本身。
然后您希望能够将应用程序部署到 Tomcat。所以 Tomcat 本身需要加载分析应用程序的 classes,在 Tomcat 启动时它甚至不存在。
那么您希望能够在 Tomcat 中部署另一个应用程序。也许第二个应用程序使用第一个应用程序也使用的库,但版本不同。因此,您希望每个应用程序都有自己独立的 class 加载程序,否则应用程序 2 的 classes 可能会严重干扰应用程序 1 的 classes。
那么您希望能够取消部署其中一个网络应用程序。所以它的 class 加载器必须被销毁并进行垃圾收集,以避免巨大的内存泄漏。
当然还有很多其他用法,但这是最常用的一种(根据我的经验)。
拥有三个基本 class 加载器(Bootstrap、扩展、系统)的原因主要是安全性。
在 JVM 1.2 版之前,只有一个默认的 class 加载器,也就是当前所谓的 "Bootstrap" class 加载器。
classes 由 class 加载器加载的方式是每个 class 加载器首先调用其父级,如果该父级未找到所请求的 class,当前的自己找
一个关键概念是 JVM 不会授予包访问权限(如果您没有特别提及 private
、public
或 [=12=,则方法和字段具有的访问权限) ]) 除非请求此访问权限的 class 来自 加载它希望访问的 class 的同一个 class 加载程序 。
因此,假设用户调用他的 class java.lang.MyClass
。理论上,它可以获得对 java.lang
包中所有字段和方法的包访问权,并改变它们的工作方式。语言本身并不能阻止这一点。但是 JVM 会阻止它,因为所有真正的 java.lang
classes 都是由 bootstrap class 加载器加载的。不相同的加载程序 = 无法访问。
class 加载程序还内置了其他安全功能,使某些类型的黑客攻击变得困难。
那么为什么要三个 class 装载机?因为它们代表三个级别的信任。最受信任的 classes 是核心 API classes。接下来是已安装的扩展,然后是出现在 class 路径中的 classes,这意味着它们在您的机器上是本地的。
有关更详细的解释,请参阅 Bill Venners's "Inside the Java Virtual Machine"。
- 存在多个 class 加载程序以加载多个应用程序
同时(一个加载服务器和另一个部署在服务器中)。
- 每个加载器都有一个层次结构来加载特定的
class确保他们之间的安全。
Java 有 3 个 class 装载机:
- BootStrap,
- 扩展和
- 系统
他们只有一个角色;从不同的包中加载 classes。
但是为什么 Java 有 3 个不同的 class 加载器而不是只有一个,因为一个 class 加载器可以加载所有必要的 classes?
class 加载器的主要用途是在应用程序服务器中。
您希望能够开始Tomcat(例如)。这已经需要至少一个 classloader 到 运行 tomcat 本身。
然后您希望能够将应用程序部署到 Tomcat。所以 Tomcat 本身需要加载分析应用程序的 classes,在 Tomcat 启动时它甚至不存在。
那么您希望能够在 Tomcat 中部署另一个应用程序。也许第二个应用程序使用第一个应用程序也使用的库,但版本不同。因此,您希望每个应用程序都有自己独立的 class 加载程序,否则应用程序 2 的 classes 可能会严重干扰应用程序 1 的 classes。
那么您希望能够取消部署其中一个网络应用程序。所以它的 class 加载器必须被销毁并进行垃圾收集,以避免巨大的内存泄漏。
当然还有很多其他用法,但这是最常用的一种(根据我的经验)。
拥有三个基本 class 加载器(Bootstrap、扩展、系统)的原因主要是安全性。
在 JVM 1.2 版之前,只有一个默认的 class 加载器,也就是当前所谓的 "Bootstrap" class 加载器。
classes 由 class 加载器加载的方式是每个 class 加载器首先调用其父级,如果该父级未找到所请求的 class,当前的自己找
一个关键概念是 JVM 不会授予包访问权限(如果您没有特别提及 private
、public
或 [=12=,则方法和字段具有的访问权限) ]) 除非请求此访问权限的 class 来自 加载它希望访问的 class 的同一个 class 加载程序 。
因此,假设用户调用他的 class java.lang.MyClass
。理论上,它可以获得对 java.lang
包中所有字段和方法的包访问权,并改变它们的工作方式。语言本身并不能阻止这一点。但是 JVM 会阻止它,因为所有真正的 java.lang
classes 都是由 bootstrap class 加载器加载的。不相同的加载程序 = 无法访问。
class 加载程序还内置了其他安全功能,使某些类型的黑客攻击变得困难。
那么为什么要三个 class 装载机?因为它们代表三个级别的信任。最受信任的 classes 是核心 API classes。接下来是已安装的扩展,然后是出现在 class 路径中的 classes,这意味着它们在您的机器上是本地的。
有关更详细的解释,请参阅 Bill Venners's "Inside the Java Virtual Machine"。
- 存在多个 class 加载程序以加载多个应用程序 同时(一个加载服务器和另一个部署在服务器中)。
- 每个加载器都有一个层次结构来加载特定的 class确保他们之间的安全。