JVM中的类加载

时间:2012-06-06 03:00:32

标签: classloader

什么时候在JVM中加载类?它们是在服务器启动时加载还是在有类的引用时加载?我的假设是所有类都被加载,因为服务器就像jboss启动一样,然后有一些叫做lazyloading的东西。

加载实际意味着什么?这是否意味着JVM内存中存在此类.class以及所有方法,变量(包括实例,静态变量方法)以及可用于执行的。我知道ClassLoader定位需要加载的Java类的字节码,读取字节码,检查particualr类中使用的其他类的refrencces,并通过创建java.lang.Class类的实例来加载它们。这使得该类可供JVM执行

是否还在JVM中加载了类和类?我的假设是方法只在线程的堆栈内存中。什么是方法记忆?它是堆还是堆栈的一部分?

只有静态方法与类加载一起加载而不是实例方法吗?我知道当类被绑定并且所有静态变量都被初始化时,静态块被执行。

如果这些疑虑得到澄清,请提前感谢。

1 个答案:

答案 0 :(得分:2)

这些是关于JVM的基本问题,Google肯定会帮助您解答答案。

对于您的一些问题(特别是有关实际加载过程的问题),您可以查看此处,例如:http://www.securingjava.com/chapter-two/chapter-two-7.html

简而言之,在开始时,JVM只加载基本(和可信)类。接下来,根据需要创建其他类加载器(例如引导类加载器),它们将加载更多类。在成功加载类之前,必须加载它所依赖的所有类。

加载的类以各种形式存储在内存中(这是特定于JVM的),但始终公开Class对象。类中的所有内容(方法,变量等)都会被加载。这并不意味着该类也被编译(编译发生在以后,需要执行方法时)。

方法变量的分配发生在堆栈(对于基元)或堆上。

静态变量的初始化和静态块的执行恰好在加载类之后,在创建它的任何实例之前发生。