blyang 你长的很好看啊~
Java类加载机制
发表于: | 分类: Java | 评论:943 | 阅读: 143107

Java类加载机制对于初学者来说可能有点深了,但是在实际开发中,理解类加载的过程的能够指导开发过程。这里大致讲一下这个Topic。程序执行时JVM通过加载、链接、初始化来完成。类的加载器将.class文件的二进制文件转载进JVM方法区,并且在堆区创建描述这个类的java.lang.class对象。之后是链接,最后是初始化完成。初始化之后这个类就可以正常使用了,直到对象不再使用之后,被垃圾回收掉,空间被释放。当没有任何引用指向class对象时就会被卸载,结束类的生命周期


一、关于JVM和类

当需要运行某个Java程序时,会在JVM中开启一个虚拟机进程,这个Java程序中的所有线程都在这个进程中执行,共享这个JVM进程的内存区。不同JVM进程中的程序不会相互影响,更不会共享数据。

当程序中需要使用某个类时,如果这个类还没有被加载到JVM内存中,则系统就会通过 ** 加载 连接 初始化 ** 来对类进行初始化。


二、类的加载

类的加载是指将类的class文件读入内存中,并为之创建一个java.lang.Class对象。文件来源可以有下面几种

  • 本地文件系统中的class文件
  • JAR包中的class文件
  • 通过网络加载class文件
  • Java源文件动态编译

当然也不一定要等到使用时才加载这个类,JVM允许预先加载。同时也要注意,JVM类加载是具有缓存机制的,保证在一个运行期中,所有加载过的class都会被缓存。所以在修改class之后,必须要重启JVM才能生效。


三、类的连接

类的连接阶段负责把类的二进制文件合并到JRE中,类连接又分为三个阶段

  • 验证:验证类文件的数据正确性,以及这个二进制文件是否适合当前版本的JVM
  • 准备:准备阶段为类变量分配内存,并设置默认初始值
  • 解析:将类的二进制数据中的符号引用替换成直接引用


四、类的初始化

在初始化阶段,JVM负责对类变量进行初始化。在初始化的过程中,针对静态变量或者是静态初始化块儿,他们的优先级别是一致的,JVM会顺序执行静态初始化语句。

而JVM怎么样判断是否是初始化的时机呢?大致有下面六种情况

  • 创建类的实例
  • 调用某个类方法
  • 访问类变量,或者为类变量赋值
  • 使用反射来强制创建某个类或者接口对应的java.lang.Class对象
  • 初始化某个类的子类
  • 直接使用java.exe命令来运行某个主类

这里需要注意的是 final 关键字,如果某个类变量使用了final修饰,并且在定义时就给它赋值,那么它的值在编译时就确定了,程序中其他地方使用它的时候,实际上并没有使用这个类变量,而是相当于直接使用了一个常量。


五、类的加载顺序

  • 父类静态成员、静态代码块
  • 子类静态成员,静态代码块
  • 父类成员函数、代码块
  • 父类构造函数
  • 子类成员函数、代码块
  • 子类构造函数

评论已关闭

TOP