java类的加载机制

概念

类的加载指:
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块

双亲委派模式

    如果一个类加载器收到类加载请求,会依次向上交给父加载器。因此所有的类加载请求都会最终传递到顶层的启动类加载器。
    意义:防止内存中出现多份同样的字节码,保证程序安全稳定运行

你可能感兴趣的:(java类的加载机制)