JVM 类加载

Java类加载机制

类加载行为发生的时间 : 在Java代码中,类型的加载,连接和初始化过程都是在运行期间完成的;

一个类的生命周期分为七个阶段: 加载连接(验证,准备,解析),初始化使用卸载

image.png

类的生命周期结束

类结束生命周期的几种情况 :

  • 执行了System.exit()方法
  • 程序正常结束
  • 程序在执行过程中遇到了异常或者错误而异常终止
  • 由于操作系统出现错误而导致Java虚拟机进程终止

类加载的三个重要阶段简介

最重要的三个阶段:加载,连接,初始化,下面简单介绍这三个阶段做的事情:

  • 加载:查找并加载类的二进制数据
  • 连接
    • 验证:确保被加载类的正确性
    • 准备:为类的静态变量分配内存,并将其初始化为默认值
    • 解析:把类的符号引用转化为直接引用
  • 初始化:为类的静态变量赋于正确的初始值

类的被动使用和主动使用

Java程序对类的使用方式:主动使用,被动使用

Java虚拟机实现必须在每个类或者接口首次主动使用时初始化它们

主动使用的几种情况:

  • 1.创建类的实例
  • 2.访问某个类或接口的静态变量,对该静态变量赋值 或者调用类的静态方法
  • 3.反射(如Class.forName(“com.xxx.xxx”))
  • 4.初始化一个类的子类(child初始化parent一定被初始化)
  • 5.标记为启动类的类
  • 6.jdk1.7动态语言的支持;

除了以上情况,其他方式都是类的被动使用,都不会导致类的初始化;

类的加载

定义:类的加载指的是将类的.class文件的二进制数据读入到内存中,将其放在运行时数据区的方法区内(jdk1.8元空间),然后在内存中创建一个java.lang.Object对象用来封装类在方法区内的数据结构(规范并未说明Class对象位于那里,HotSpot虚拟机将其放在了方法区中)

加载Class文件的方式:

  • 在本地系统中直接加载
  • 通过网络下载
  • 从zip,jar等归档文件中加载
  • 从专有数据库中加载
  • 将Java源文件动态的编译为.class文件(如JSP转化为Servlet)

静态变量所在类的主动使用

  • 只有定义了该字段的类才会被初始化
  • 子类在初始化时,要求它的父类先被初始化
原文地址:https://www.cnblogs.com/fubinhnust/p/11956040.html