1.类的加载时机
类从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期包括:加载(loading)、验证(Verification)、准备(Prepatation)、解析(Resolution)、初始化(Initialization)、使用(Using)和卸载(Unloading)七个阶段。以下四种情况立即对类进行初始化(1)遇到new、getstatic、putstatic 或invokestatic这四条字节指令时,如果类没有进行初始化,则需要触发基初始化。生成这4条指令的最觉的java代码场景是:使用new关键字实例化对象的时候、读取或设置一个类的静态字段(被final)修饰、已在编译期把结果放入常量池的静态字段除外)的时候,以及调用一个类的静态方法的时候。(2)使用java.lang.reflect包的方法对类进行调用的时候,如果类没有进行过初始化,则需要先触发其初始化。(3)当初始化一个类的时候,如果发现其父类还没进行初始化,则需要先触发其父类的初始化。接口并不要求其父接中全部都完成初始化。(4)当虚拟机启动时,用户需要指定一个要执行的主类(包含main()方法的那个类),虚拟机会先初始化这个主类。
2.类的加载过程
2.1加载
加载阶段虚拟机要完成以下三件事情(1)通过一个类的全限定名来获取此类的二进制字节流(2)将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构(3)在java堆中生成一个代表这个类的java.lang.Class对象,作为方法区这些数据的访问入口。
2.2验证
(1)文件格式验证(2)元数据验证(3)字节码验证(4)符号引用验证,如果无法通过符号验证就会抛出java.lang.IllegalAccessError、java.lang.NoSucheFieldError 、java.lang.NosuchMehodeError等。-Xverify:none参数来关闭大部分的类验证措施,以缩短虚拟机类加载的时间。
2.3准备
准备阶段是正式为类变量分配内存并设置类变量初始值的阶段,这些内存都将在方法区进行分配。这个时候分配只有类变量,实例变量会在对象实例化时随着对象一起分配在java堆中。
2.4解析
解析是虚拟机将常量池内的符号引用替换为直接引用 的过程。包括接口或类的解析、字段解析、接口方法解析、类方法解析。
2.5初始化
在初始化阶段,根据程序制定的主观计划去初始化类变量和其他资源。
3.类加载器
3.1类与类加载器
对于任意一个类,都需要由加载它的类加载器和这个类本身一同确立其在java虚拟机中的唯一性。比较两个类是否相等,只有在这两个类由同一个类加载器加载的前提之下才有意义,否则,即使这两个类是来源于同一个Class文件,只要加载它们的类加载器不同,那这两个类就必定不相等。
3.2双亲委派模型
站在虚拟机的角度讲,只存在两种不同的类加载器:一种是启动类加载器(Bootstrap ClassLoader),这个类加载 器使用C++语言实现,是虚拟机自身 的一部分;另一种就是所有其他的类加载器,这些类加载器都是由java语言实现,独立于虚拟机外部,并且全都继承自抽象类java.lang.ClassLoader.绝大部分java程序都会使用以下三种系统提供的类加载器(1)启动类加载器(Bootstrap ClassLoader),启动类加载器无法被java程序直接引用。负责%JAVA_HOME%\lib目录(2)扩展类加载器(Extension ClassLoader),负责加载%JAVA_HOME%\lib\ext目录(3)应用程序类加载器(Application ClassLoader),负责ClassPath指定的类库。这些类的加载关系如下:
以上层次关系,就称为双亲很少模型(Parents Delegation Model).双亲委派模型要求除了顶层的启动类加载器外,其余的类加载器都应当有自己的父类加载器。这里类加载器之间的父子关系一般不会以继承(Inheritance)关系来实现,而是都使用组合(Compostion)关系来复用父加载器的代码。使用双亲委派模型来组织类加载器之间的关系,有一个显而易见的好处 就是java类随着它的类加载器一起具备了一种带有优先级所层次关系。例如类java.lang.Object,它存放 在rt.jar,无论哪个类加载器自行去加载的话,最终都是委派给启动类加载 器进行加载。
3.3破坏双亲委派模型
(1)jdk1.2发布之前
(2)模型自身缺陷,如:JNDI、JDBC、JCE、JAXB、JBI等服务,为了解决这个问题,引入了线程上下方类加载器(Thread Context ClassLoader)
(3)由于 用户程序动态性的追求导致的。在OSGI环境下,类加载器不再是双亲委派模型中树状结构,面是进一步发展为网状结构。
java虚拟机的类加载机制
最新推荐文章于 2022-11-04 15:13:07 发布