概念
类的加载指:
1、将类的.class文件中的二进制数据读到内存中
2、放在运行时数据区的方法区中,然后在堆区创建.class的对象
3、对外提供访问方法区的数据结构的接口
4、JVM规范允许类加载器预加载该类,预加载的过程遇到class文件缺失或错误,类加载器必须在程序被首次调用时才报告错误
类的生命周期
加载 验证 准备 解析 初始化 使用 卸载
其中解析阶段不一定是这个顺序,可以在初始化之后开始解析,主要为了支持java的运行时绑定(动态绑定)。
1、加载:
通过类的全限定名来获取定义的二进制字节流
将这个字节流所代表的静态存储结构转化为方法区运行时数据结构
在java堆中生成一个代表这个类的对象,作为访问入口
2、验证
确保被加载类的正确性
3、准备
对类变量分配内存 以及初始化默认值
注:初始化值通常情况下 数据类型默认零值
1、对于基本数据类型来说,类变量和全局变量如果不显式的对其赋值而直接使用,则系统会默认零值
2、局部变量来说,使用前必须显示赋值,否则编译不通过
3、static和final修饰的常量,必须声明时显式赋值,否则编译不通过。并且常量在准备阶段就会被初始化为指定值。
4、final修饰的常量则可以在声明时显式赋值,也可以在类初始化时显式赋值。总之必须使用前显式赋值,否则系统不会为其赋予零值
4、解析:把类中的符号引用转换为直接引用
5、初始化
1、为类的静态变量赋正确的初始值(声明类变量指定初始值,静态代码块指定初始值)
2、初始化时机:只有当类主动使用时,才会导致类初始化。
创建类的实例
访问类的静态变量,调用类的静态方法 ,反射,初始化子类会先初始化父类,启动类
6、结束生命周期
执行system.exit()方法,程序正常结束,出现异常导致结束,操作系统错误导致jvm进程终止。
类加载器
启动类加载器 java.开头的类
扩展类加载器 javax.开头的类
应用程序类加载器 负载加载用户类路径所指定的类。开发者可以直接使用该类加载器,没有指定则默认
jvm类加载机制
1、全盘负责 :当一个类加载器负责某个类时,他所依赖的类也由他负责加载
2、父类委托:先让父类加载器试图加载。
3、缓存机制:保证所有加载过的class都会被缓存。所以修改了class后,必须重启jvm,程序修改才会 生效
类的加载方式
1、命令行启动应用jvm初始化
2、class.forName()动态加载 ,还会对类进行解释,执行static块
3、classLoader.loadClass() 动态加载,只会干一件事,将.class文件加载到jvm中。 只有newinstance才会执行static块
双亲委派模式
如果一个类加载器收到类加载请求,会依次向上交给父加载器。因此所有的类加载请求都会最终传递到顶层的启动类加载器。
意义:防止内存中出现多份同样的字节码,保证程序安全稳定运行