类从JVM对其加载到卸载,它的整个生命周期包括如下几个阶段:html
其中,链接(Linking),又分为验证(Validation)、准备(Preparation)、解析(Resolution)3个子阶段。java
在加载阶段,JVM主要完成三件事:算法
1. 经过类的全限定名来查找、获取定义此类的二进制字节流。数据库
2. 将这个字节流所表明的静态存储结构转化为方法区中的运行时数据结构。网络
3. 在Java堆中建立一个表明这个类的java.lang.Class对象,做为方法区中静态数据的访问入口。数据结构
有如下几种类加载器:函数
BootstrapClassLoader(启动类加载器):它加载System.getProperty("sun.boot.class.path")所指定jar,即目录${JAVA_HOME中}/jre/lib、${JRE_HOME中}/jre/lib下的全部jar; Bootstrap ClassLoader由C++实现,它不是ClassLoader的子类,它是顶级的类加载器。spa
ExtClassLoader(扩展类加载器):它加载System.getProperty("java.ext.dirs")所指定jar,即目录${JAVA_HOME中}/jre/lib/ext、${JRE_HOME中}/jre/lib/ext下的全部jar; 它是BootstrapClassLoader的子类。code
AppClassLoader(应用类加载器):它加载应用程序运行时指定的classpath下的jar; 它是ExtClassLoader的子类。htm
public static void main(String[] args) { //System.out.println(System.getProperty("sun.boot.class.path")); //System.out.println(System.getProperty("java.ext.dirs")); Book book= new Book(); Class c = book.getClass(); ClassLoader loader = c.getClassLoader(); System.out.println(loader); System.out.println(loader.getParent()); System.out.println(loader.getParent().getParent()); }
以上程序的执行结果为:
sun.misc.Launcher$AppClassLoader@439a8942 sun.misc.Launcher$ExtClassLoader@56a96eba null
从上面的结果能够看出,并无获取到ExtClassLoader的父Loader,缘由是Bootstrap Loader是用C++语言实现的,找不到一个肯定的返回父Loader的方式,因而就返回null。
运行一个程序时,老是由AppClassLoader开始加载指定的类,而后它会将加载任务转交给父加载器,父类加载器再将向上转交给BootstrapClassLoader; 若是父类加载器找不到类文件,则逐层由子类加载器处理。
类的链接(Linking),又分为验证(Validation)、准备(Preparation)、解析(Resolution)三个子阶段。
2.1 验证(Validation),验证的做用是保证Class文件的字节流包含的信息符合JVM规范,不会给JVM形成危害。若是验证失败,就会抛出一个java.lang.VerifyError异常或其子类异常。类的验证内容有:
2.2 准备(Preparation) 准备阶段要作的事情就是为静态变量分配内存并设置默认值。在这个阶段分配的仅为类的static变量,而不包括类的实例变量。
2.3 解析(Resolution) 解析阶段要作的事情就是将方法区常量池内的符号引用替换成直接引用。有如下四种类型的解析:类或接口的解析、属性解析、方法解析、接口方法解析。
类的初始化就是把类的变量(包括实例变量)初始化为正确的值、并执行 static{}块、构造函数等。
何时会执行类的初始化呢?
类的卸载,即指垃圾回收器机制(GC)识别无用对象,并对无用对象占用的内存空间进行回收。垃圾回收机制有如下几种算法(但不限于这几种):
关于垃圾回收机制的更多内容,请参考: http://www.importnew.com/16173.html