jvm是否加载了类路径提到的所有类?

当我们使用-cp命令调用java命令时,我们提供了一些目录和jar文件。 jvm是否加载了类路径提到的所有类或者它只是jvm在需要时会查找的所有类的超级集合?

jvm是否加载了类路径提到的所有类或者它只是jvm在需要时会查找的所有类的超级集合?

JVM根据需要从类路径加载类,即当找到类的引用时,它会被加载。 JVM中还有类加载器的层次结构,由较低类加载器使用由父类加载器加载的类。

涉及两个概念

  • 装载
  • 初始化

初始化类将初始化字段并执行静态块。 这种情况发生的确切时刻对于应用程序语义很重要,因此它是精确定义的 。

初始化需要先加载; 但加载更多是JVM的内部概念。 即使不需要,JVM也可以并且被允许积极地预加载类。 此过程不会影响应用程序语义,也不会对应用程序不可见。

就应用程序而言,如果我们获得它的Class对象,例如来自Foo.classClass.forName或其他reflectionAPI,则必须加载一个Class 。 我们可以检查类的属性,而不必触发初始化。

一个重要的约束 – 我们必须为同一个类名(以及来自同一个类加载器)获取相同的Class对象。 Class对象是已加载类表示。

  1. JVM只加载引用的类,而不加载类路径中jar中的每个类
  2. 类的加载通过分层方式进行
  3. 在类路径中有太多的jar只占用更多的磁盘空间
  4. JVM仅在物理内存(RAM)中使用内存。

类的加载按顺序进行并查看位置。 -cp属于下面列出的第三类。大多数应用程序类应该通过-cp提供,或者它将查找环境变量CLASSPATH。

扩展框架使用类加载委托机制。 当运行时环境需要为应用程序加载新类时,它将按顺序在以下位置查找该类:

1)Bootstrap类: rt.jar中的运行时类,i18n.jar中的国际化类等。

2)已安装的扩展: JRE的lib / ext目录中的JAR文件中的类,以及系统范围的特定于平台的扩展目录(例如Solaris™操作系统上的/ usr / jdk / packages / lib / ext) ,但请注意,此目录的使用仅适用于Java™6及更高版本)。

3)类路径:类,包括JAR文件中的类,由系统属性java.class.path指定的路径。 如果类路径上的JAR文件具有带有Class-Path属性的清单,则还将搜索由Class-Path属性指定的JAR文件。 默认情况下,java.class.path属性的值为。,即当前目录。 您可以使用-classpath或-cp命令行选项或设置CLASSPATH环境变量来更改该值。 命令行选项会覆盖CLASSPATH环境变量的设置。

https://docs.oracle.com/javase/tutorial/ext/basics/load.html

它不会加载所有类,但它知道在需要时在哪里查找它们。

它们将在首次需要时加载。