java类加载的过程
执行代码的大体流程如下
1.开始执行代码
2.java.exe调用底层的jvm.dll文件创建java虚拟机,这一步是C++来实现的
3.创建一个引导类加载器实例,这个加载类实例是C++来创建的
4.C++调用java代码创建JVM启动器Launcher,此类由引导类加载器加载,使用Launcher来创建其它的类加载器
5.获取运行类自己的加载器,如果是我们自己写的类一般是AppClassLoader
6.加载器调用loadClass方法,加载要运行的类
7.加载完成后,jvm会调用main方法
8.C++发起调用
加载类的过程有以下几个步骤
1.加载:通过io流读入字节码文件,在使用到类的时候才进行加载,比如调用 new main方法等,在加载阶段都会生成代表这个类的Class对象,放到方法区,作为这个类各种数据访问的入口
2.验证:校验字节码文件的正确性
3.准备:给类的静态变量分配内存,并赋默认值
4.解析:将符号引用替换为直接引用,只作用在静态方法上,也就是静态链接过程。动态链接,是程序运行期间符号引用替换为直接引用
5.初始化:将静态变量初始化为指定的值,执行静态读代码块
当类被加载到方法区后,包含:运行时常量池、类型信息、字段信息、方法信息、类加载器的引用、对应class实例的引用等
类加载器的引用:这个类到类加载器的引用。
对应class实例的引用:类加载器在加载类信息放到方法区后,会创建一个对应的Class类型的对象实例放到堆中,作为开发人员访问方法区中类定义的入口和切入点