当程序主动使用某个类时,如果这个类还未被加载到内存中,则系统会通过三个步骤对类进行初始化:
1、类的加载:将类的Class文件加载到内存中,并为其生成Java.lang.class对象(此过程由类加载器完成)
2、类的链接:将Java类的二进制数据合并到jvm运行状态中(jre)
2.1、验证:确保类符合JVM规范,保证安全性
2.2、准备:为类变量分配内存和初始化值
2.3、解析:JVM常量池中的符号引用(常量名)直接替换成直接引用(地址)
3、类的初始化:JVM对类进行初始化
执行类构造器方法(这个方法是由编译期自动收集类中所有类变量的赋值动作和静态代码块中的语句合并产生的(类构造器是构造类信息的,不是构造该类对象的构造器))
当初始化一个类的时候,如果发现其父类还没有进行初始化,则需要先触发其父类的初始化。
JVM会保证一个类的()方法在多线程环境中被正确加锁和同步。
类加载器的作用:
将class文件字节码内容加载到内存中,并将这些静态数据转换成方法区运行时的数据,然后在堆中生成一个代表这个类的Java.lang.class对象,作为方法区中类数据的访问入口
Java的类加载器有哪些?
引导类加载器、扩展类加载器、系统类加载器、自定义加载器
系统类加载器是自定义加载器的父类。(通过继承ClassLoader实现自定义加载器)
你了解JMM吗?
JMM是JAVA内存模型,是一种缓存性一致协议
它定义了数据读写规则,定义了线程和主内存抽象关系,线程之间共享变量存储在主内存,每个线程都有一个私有的本地工作内存