2016-09-21 55 views
3

说我开始web服务器(或任何其他java进程),所有的类(元数据像类定义)都会在服务器/进程启动时加载,即使在系统中任何地方使用它们或在运行时加载它们只有在对象正在创建或导入语句遇到?何时由JVM加载类?

这个问题对JDK 8和JDK 6

+0

请参阅[Java Virtual Machine Specification#5](http://docs.oracle.com/javase/specs/jvms/se8/html/jvms-5.html)。 – EJP

回答

0

首先,在字节码,没有进口语句。字节码只是使用完全限定的名字遍布整个地方。

然后,大多数JVM的默认行为是“惰性”加载类。这意味着:当你加载类A时,JVM将只加载那些运行A的所有静态初始化程序所需的类。

所以,如果A“使用”B和C;那么B,C只在JVM执行需要B resp的代码时才加载。 C被加载。

当你编写你的自己的类加载器时,你当然可以做不同的事情。

+0

,因此它们在运行时被加载并在被引用时加载。对 ? – emilly

+0

是的,这将是说明发生了什么的正确方法。 – GhostCat

0

看到Class loading architecture

下面是相关线路在你的问题的情况下

类加载器架构,这样在启动的JVM不需要 了解类任何会在运行时加载。

最初当JVM启动时,没有任何内容加载到它。正在执行的程序的 类文件首先被加载,然后其他的 类和接口被加载,因为它们在被执行的 字节码中被引用。

0

JVM会延迟加载类。 均值类是根据需要直接或间接加载的。