按照《深入理解JAVA虚拟机》中间的原理,讲虚拟机记载一个类的而整个过程理解记录了下,一共分为7个过程,从加载到最终的卸载:
其中,加载、验证、准备、初始化和卸载是按照顺序确定的,但是其它就不一定了。
关于加载,想从几个方面说下:
- when?
何时加载一个类,虚拟机的规范中没有说明,该书中换了一个角度,从虚拟机初始化的条件来讲虚拟机加载类的时间。Java虚拟机规范中,规定了虚拟机初始化类的5中条件:
0).遇到new、getstatic、pustatic或者invokestatic 这四个指令的时候。
1).使用java.lang.refect对类进行反射调用的时候。
2).初始化一个类的时,会触犯其父类初始化。
3).虚拟机启动时候的包含main方案的类。
4).当使用JDK1.7的动态语言支持时,如果一个java.lang.invoke.MethondHandle 实例最后的解析结果REF_getstatic、REF_putStatic、REF_invokeStatic的方法句柄,并且这个方法句柄所对应的类没有经过初始化,则先必须进行初始化。 - where?
通过类的一个全限名来获取定义次类的二进制字节流。
因为获取到的类只是说明字节流中获取,那么其实没有限定从文件中获取。所以获取的来源很广:1、从class文件。2、zip、jar、war等类型的压缩文件。3、网络从获取。4、动态代理技术。5、其它文件,例如JSP。5、从其它地方获取。
- who?
- -