jvm 是否加载类路径中提到的所有 类?
Does jvm load all the classes mentioned by the classpath?
当我们使用-cp 命令调用java 命令时,我们会提供一些目录和jar 文件。
jvm 是否加载类路径提到的所有 类 或者它只是所有 类 的超集,jvm 将在需要时查找加载?
Does jvm load all the classes mentioned by the classpath Or it is just
a super set of all classes which jvm will look up to load when
required?
JVM 根据需要从 class 路径加载 classes,即当找到 class 的引用时,它会被加载。在 JVM 中还有一个 class 加载器的层次结构,由父 class 加载器加载的 class 由较低的 class 加载器使用。
class 的加载按顺序发生并查找位置。
-cp 属于第三类,如下所列。大多数应用程序 classes 应通过 -cp 提供,否则它将查找环境变量 CLASSPATH。
扩展框架使用了class加载委托机制。当运行时环境需要为应用程序加载新的 class 时,它会在以下位置查找 class,顺序为:
1)Bootstrap classes: 运行时 classes in rt.jar, 国际化 class es 在 i18n.jar 和其他人中。
2)已安装的扩展: class在 JRE 的 lib/ext 目录中的 JAR 文件中,在系统范围内,平台-特定的扩展目录(例如 Solaris™ 操作系统上的 /usr/jdk/packages/lib/ext,但请注意,此目录的使用仅适用于 Java™ 6 及更高版本)。
3)class路径:class,包括JAR文件中的class,在系统指定的路径属性 java.class.path。如果 class 路径上的 JAR 文件具有带有 Class-Path 属性的清单,则还将搜索由 Class-Path 属性指定的 JAR 文件。默认情况下,java.class.path 属性 的值为 .,当前目录。您可以使用 -classpath 或 -cp 命令行选项或设置 CLASSPATH 环境变量来更改该值。命令行选项覆盖 CLASSPATH 环境变量的设置。
https://docs.oracle.com/javase/tutorial/ext/basics/load.html
它不会加载所有 类,但它知道在您需要它们时在哪里寻找它们。
它们将在第一次需要时加载。
这里涉及两个概念
- 加载中
- 初始化
初始化一个class将初始化字段并执行静态块。发生这种情况的确切时刻对应用程序语义很重要,因此它是 precisely defined。
初始化需要先加载;但加载更多是 JVM 的内部概念。 JVM 可以并且被允许主动预加载 classes,即使不需要。此过程不会影响应用程序语义,并且对应用程序是不可见的。
就应用程序而言,如果我们得到它的 Class
对象,则必须加载 class,例如来自 Foo.class
、Class.forName
或其他反射 API。我们可以检查 Class
的属性,而不必触发初始化。
一个重要的约束 - 我们必须为相同的 class 名称获取相同的 Class
对象(并且来自相同的 classloader)。 Class
对象是已加载 class 的 表示。
- JVM 仅加载引用的 classes 而不是每个 class 存在于您的 classpath
的 jars 中
- classes 的加载是通过分层方式进行的
- class路径中的 jar 太多只会占用更多磁盘space
- JVM 仅使用物理内存 (RAM) 中的内存。
当我们使用-cp 命令调用java 命令时,我们会提供一些目录和jar 文件。 jvm 是否加载类路径提到的所有 类 或者它只是所有 类 的超集,jvm 将在需要时查找加载?
Does jvm load all the classes mentioned by the classpath Or it is just a super set of all classes which jvm will look up to load when required?
JVM 根据需要从 class 路径加载 classes,即当找到 class 的引用时,它会被加载。在 JVM 中还有一个 class 加载器的层次结构,由父 class 加载器加载的 class 由较低的 class 加载器使用。
class 的加载按顺序发生并查找位置。 -cp 属于第三类,如下所列。大多数应用程序 classes 应通过 -cp 提供,否则它将查找环境变量 CLASSPATH。
扩展框架使用了class加载委托机制。当运行时环境需要为应用程序加载新的 class 时,它会在以下位置查找 class,顺序为:
1)Bootstrap classes: 运行时 classes in rt.jar, 国际化 class es 在 i18n.jar 和其他人中。
2)已安装的扩展: class在 JRE 的 lib/ext 目录中的 JAR 文件中,在系统范围内,平台-特定的扩展目录(例如 Solaris™ 操作系统上的 /usr/jdk/packages/lib/ext,但请注意,此目录的使用仅适用于 Java™ 6 及更高版本)。
3)class路径:class,包括JAR文件中的class,在系统指定的路径属性 java.class.path。如果 class 路径上的 JAR 文件具有带有 Class-Path 属性的清单,则还将搜索由 Class-Path 属性指定的 JAR 文件。默认情况下,java.class.path 属性 的值为 .,当前目录。您可以使用 -classpath 或 -cp 命令行选项或设置 CLASSPATH 环境变量来更改该值。命令行选项覆盖 CLASSPATH 环境变量的设置。
https://docs.oracle.com/javase/tutorial/ext/basics/load.html
它不会加载所有 类,但它知道在您需要它们时在哪里寻找它们。
它们将在第一次需要时加载。
这里涉及两个概念
- 加载中
- 初始化
初始化一个class将初始化字段并执行静态块。发生这种情况的确切时刻对应用程序语义很重要,因此它是 precisely defined。
初始化需要先加载;但加载更多是 JVM 的内部概念。 JVM 可以并且被允许主动预加载 classes,即使不需要。此过程不会影响应用程序语义,并且对应用程序是不可见的。
就应用程序而言,如果我们得到它的 Class
对象,则必须加载 class,例如来自 Foo.class
、Class.forName
或其他反射 API。我们可以检查 Class
的属性,而不必触发初始化。
一个重要的约束 - 我们必须为相同的 class 名称获取相同的 Class
对象(并且来自相同的 classloader)。 Class
对象是已加载 class 的 表示。
- JVM 仅加载引用的 classes 而不是每个 class 存在于您的 classpath 的 jars 中
- classes 的加载是通过分层方式进行的
- class路径中的 jar 太多只会占用更多磁盘space
- JVM 仅使用物理内存 (RAM) 中的内存。