java虚拟机学习-类加载
java虚拟机加载类过程可以分为加载、链接、初始化、使用、卸载,其中链接有可以分为验证、准备、解析三个过程,如上图所示。
类加载的时机
1、遇到new、getstatic、putstatic、invokestatic这四条字节码指令时,如果类还没有被初始化,则需要先初始化。
2、遇到java.lang.reflact包中的方法对类进行反射操作时,类如果没有被实例化,则需要先初始化。
3、初始化一个类时,如果父类没有初始化,则先初始化父类
4、当启动虚拟机时,用户需要指定一个主程序(main),虚拟机先会初始化这个类
5、动态语言支持
1、加载
1)、java虚拟机加载类是通过类加载器加载,加载过程主要是通过类的一个全限定名来获得这个类的二进制字节流。
2)、将二进制字节流中代表的静态数据转化为方法区的运行时数据结构
3)、在内存中生成一个代表这个类的java.lang.Class的对象,作为方法区的这个类的各种数据访问入口
2、链接
1)、验证:主要对字节流文件格式、原数据类型、字节码验证、符号引用验证
2)、准备:给类变量(被static修饰的变量)分配(在方法区分配)内存并初始化,这里的类只是指的被static修饰的类变量,,不包括类的实例变量,实例变量在类被实例化的时候同类实例化对象一起放在堆中
3)、解析:将符号引用替换为直接引用。符号引用:是指一组来描述引用目标的符号,符号可以是任何形式的字面量,只要使用时无歧义的定义到目标。直接引用:是指直接指向目标引用的指针或者相对偏移量或者间接指向目标的句柄。
3、初始化
真正开始执行Java代码或者说是字节码,初始化开始执行类的构造器<clinit()>,<clinit()>方法开始主动收集类变量、静态代码块,执行顺序根据语句的顺序

浙公网安备 33010602011771号