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

时间:2015-06-24 12:46:34

标签: java classloader

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

5 个答案:

答案 0 :(得分:10)

  

jvm是否加载了类路径提到的所有类,或者只是   所有类的超级集合,jvm将在以后加载   需要?

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

答案 1 :(得分:3)

涉及两个概念

  • 装载
  • 初始化

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

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

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

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

答案 2 :(得分:1)

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

答案 3 :(得分:0)

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

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

1)Bootstrap类: rt.jar中的运行时类,i18n.jar中的国际化类以及其他类。

2)已安装的扩展: JRE的lib / ext目录中的JAR文件中的类,以及系统范围内特定于平台的扩展目录(例如/ usr / jdk / packages) Solaris™操作系统上的/ 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

答案 4 :(得分:0)

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

首次需要时会加载它们。