类加载分析–理论部分
1、Java内存分析
Java内存分为三个区:
堆内存:存放new的对象和数组,垃圾回收主要在堆内存中
栈内存:存放基本变量类型、引用类型变量(地址指向堆内存中的地址)
方法区:包含了所有的class和static变量

2、类加载的过程
类加载主要可以分为三步(如下图所示)

加载:将class文件字节码内容加载到内存中,并将这些静态数据转换成方法去的运行时数据结构,然后生成一个代表这个类的java.lang.Class对象。
链接:将Java类的二进制代码合并到JVM的运行状态之中的过程。如下过程
1.验证:确保加载的类信息符合JVM规范,没有安全方面的问题。
2.准备:正式为类变量(static)分配内存并设置类变量默认初始值的阶段,这些内存都将在方法区中进行分配。
3.解析:虚拟机常量池内的符号引用(常量名)替换为直接引用(地址)的过程
初始化:
1.执行类构造器(<clinit>)方法的过程。类构造器(<clinit>)方法是由编译期自动收集类中所有类变量的赋值动作和静态代码块中的语句合并产生的。(类构造器是构造类信息的,不是构造该类对象的构造器)
2.当初始化一个类的时候,如果发现其父类还没有进行初始化,则需要先触发其父类的初始化。
3.虚拟机会保证一个类的(<clinit>)方法在多线程环境中被正确加锁和同步。
评论区