类加载

Java面试总结----- Java类加载

类加载是Java中非常重要的一块内容。



虚拟机把描述类的数据从 Class 文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的 Java 类型,这就是虚拟机的类加载机制。

在Java语言里面,类型的加载、连接和初始化过程都是在程序运行期间完成的。

1. 简述

1.1 加载:把 .class文件从磁盘加载进内存里。
1.2 连接:确定类与类的关系,其过程分为验证、准备、解析。
1.3 初始化:对静态变量进行赋值,执行 () 方法。

2.生命周期

在这里插入图片描述2.1 加载:查找并加载类的二进制数据

  • 通过全限定类名来获取定义此类的二进制字节流。1
  • 将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构,即把二进制数据流放在方法区内。
  • 在内存中生成一个代表这个类的 java.lang.Class 对象,作为方法区这个类的各种数据的访问入口。

2.2 连接:

  • 验证:确保被加载的类的正确性,保证符合jvm的规定。
  • 准备:为类的静态变量并初始化为默认值
  • 解析:把类中的符号引用2 转换为直接引用3

2.3 初始化:
为类的静态变量赋予正确的初始值。

到初始化阶段,才真正开始执行类中定义的 Java 程序代码,此阶段是执行 <clinit>()方法的过程。

<clinit>() 方法是由编译器按语句在源文件中出现的顺序,依次自动收集类中的所有类变量的赋值动作和静态代码块中的语句合并产生的。(不包括构造器中的语句。构造器是初始化对象的,类加载完成后,创建对象时候将调用的 <init>() 方法来初始化对象)

2.4 使用: 程序正常使用这个类。

2.5 卸载: 从内存中删除(不常用)

3.补充知识

3.1 Java程序对类的使用方式分为:

  • 主动使用
    • 创建类的实例
    • 访问某个类或某个接口的静态变量(助记符为getstatic),或者对它们的静态变量进行赋值(助记符为putstatic
    • 调用类的静态方法(助记符为invokestatic
    • -反射(如Class.forName(“com.test.Test”)
    • 初始化一个类的子类
    • Java虚拟机启动时被标明启动类的类,虚拟机启动时,用户需要指定一个要执行的主类(包含 main() 方法的那个类),虚拟机会先初始化这个主类。
    • 动态语言…
  • 被动使用(除了主动初始化其他)

所有的Java虚拟机必须在每个类或者接口被Java程序“首次主动使用时”才初始化它们,如果不是首次使用或非主动使用是不会被初始化的

3.2 当出现以下几种情况时,虚拟机退出执行:

  • 执行了 System.exit() 方法。
  • 程序正常结束。
  • 程序在运行期间遇到了错误或异常而异常终止。
  • 操作系统出现错误导致程序终止。

3.3 从哪儿加载.class文件

  • 本地磁盘

  • 网上加载.class文件(Applet)

  • 从数据库中

  • 压缩文件中(ZAR,jar等)

  • 从其他文件生成的(JSP应用)

  • 将Java源文件动态编译成.class 文件(动态代理)


  1. :全限定类名:即从包开始一直到具体的类,例:java.lang.Thread ↩︎

  2. 符号引用:字面量形式的引用,即间接引用。 ↩︎

  3. 直接引用:用内存地址形式表示 ↩︎

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值