【问题标题】:What is the reason for having 3 Class loaders in JavaJava中有3个类加载器的原因是什么
【发布时间】:2015-01-18 15:12:22
【问题描述】:

Java 有 3 个类加载器:

  • 引导带,
  • 扩展和
  • 系统

他们只有一个角色;从不同的包中加载类。

但是为什么 Java 有 3 种不同的类加载器而不是只有一种,因为一个类加载器可以加载所有必要的类?

【问题讨论】:

  • 由特定类加载器加载的类从该类加载器继承其权限。普通 JVM 实例中有三个基本权限域。当然,还有更多。

标签: java classloader


【解决方案1】:

拥有三个基本类加载器(Bootstrap、扩展、系统)的原因主要是安全性。

在 JVM 1.2 版之前,只有一个默认的类加载器,也就是目前所谓的“Bootstrap”类加载器。

类加载器加载类的方式是,每个类加载器首先调用其父类,如果该父类没有找到所请求的类,则当前的类会自行查找。

一个关键概念是 JVM 不会授予包访问权限(如果您没有特别提到 privatepublicprotected,则方法和字段具有的访问权限)除非类请求此访问来自同一个类加载器,该类加载器加载了它希望访问的类。

因此,假设用户调用他的班级java.lang.MyClass。从理论上讲,它可以获得对java.lang 包中所有字段和方法的包访问权限,并更改它们的工作方式。语言本身并不能阻止这一点。但是 JVM 会阻止这一点,因为所有真正的 java.lang 类都是由引导类加载器加载的。不同的加载器 = 没有访问权限。

类加载器中内置了其他安全功能,使得某些类型的黑客攻击变得困难。

那么为什么要三个类加载器呢?因为它们代表了三个级别的信任。最受信任的类是核心 API 类。接下来是安装的扩展,然后是出现在类路径中的类,这意味着它们在您的机器上是本地的。

更详细的解释请参考Bill Venners's "Inside the Java Virtual Machine"

【讨论】:

    【解决方案2】:

    类加载器的主要用途是在应用程序服务器中。

    您希望能够启动 Tomcat(例如)。这已经需要至少一个类加载器来运行 tomcat 本身。

    然后您希望能够将应用程序部署到 Tomcat 中。所以Tomcat本身需要加载一个分析应用程序的类,这个类在Tomcat启动时甚至都不存在。

    然后您希望能够在 Tomcat 中部署另一个应用程序。也许第二个应用程序使用了第一个应用程序也使用的库,但版本不同。因此,您希望每个应用程序都有自己的隔离类加载器,否则应用程序 2 的类可能会严重干扰应用程序 1 的类。

    然后您希望能够取消部署其中一个 web 应用程序。所以它的类加载器必须被销毁和垃圾回收,以避免巨大的内存泄漏。

    当然还有很多其他用法,但这是最常用的一种(根据我的经验)。

    【讨论】:

    • 虽然这是真的,但它是否回答了有关引导、系统和扩展类加载器的问题?
    • 我没有在tomcat的上下文中问过这个问题。让我们以打印“Hello World”的简单公共静态无效主类为例。在这种情况下,java 使用所有三个类加载器。
    • 您问为什么 Java 决定使用不同的类加载器。这个答案解释了为什么需要多个类加载器:从不同位置加载类,在启动时不一定知道,并提供一种将类相互隔离的方法。这本身就证明了对多个类加载器的需求。这 3 个类加载器的工作方式以及每个类加载器的职责在docs.oracle.com/javase/tutorial/ext/basics/load.html 中进行了描述
    • 因此,1. 存在多个类加载器以同时加载多个应用程序。& 2.每个加载器都有一个层次结构,仅加载某些类以确保它们之间的安全性。我说的对吗?
    【解决方案3】:
    1. 存在多个类加载器以加载多个应用程序 同时(一个加载服务器和其他部署在服务器中)。
    2. 每个加载程序都有一个层次结构,只能加载某些 类以确保它们之间的安全性。

    【讨论】:

      猜你喜欢
      • 2014-07-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-16
      • 1970-01-01
      • 2010-10-31
      • 2017-04-10
      相关资源
      最近更新 更多