Cyan Blog Cyan Blog
首页
  • Java (opens new window)
  • JUC (opens new window)
  • JVM (opens new window)
  • Redis

    • Redis安装 (opens new window)
    • Redis基础 (opens new window)
    • Redis实战 (opens new window)
    • Redis集群安装 (opens new window)
    • Redis分布式缓存 (opens new window)
    • Redis多级缓存 (opens new window)
    • Redis原理 (opens new window)
  • 管理工具

    • Maven (opens new window)
    • Git (opens new window)
  • SSM

    • Spring (opens new window)
    • SpringBoot (opens new window)
    • Mybatis (opens new window)
    • MybatisPlus (opens new window)
  • 微服务

    • Docker (opens new window)
    • RabbitMQ (opens new window)
    • SpringCloud (opens new window)
    • Dubbo (opens new window)
    • MongoDB (opens new window)
    • Zookeeper (opens new window)
  • Java面试题 (opens new window)
  • JUC面试题 (opens new window)
  • JVM面试题 (opens new window)
  • Linux面试题 (opens new window)
  • SQL面试题 (opens new window)
  • Maven面试题 (opens new window)
  • Redis面试题 (opens new window)
  • SSM面试题 (opens new window)
  • SpringCloud面试题 (opens new window)
  • Linux (opens new window)
  • C++ (opens new window)
  • 数据库

    • MySQL (opens new window)
    • NoSQL (opens new window)
  • 软件测试

    • 软件测试 (opens new window)
  • 加密解密 (opens new window)
  • bilibili字幕提取 (opens new window)
  • 道理 (opens new window)
  • 关于博主

    • Github (opens new window)
    • CSDN (opens new window)
  • 关于本站

    • 如何搭建博客网站 (opens new window)
首页
  • Java (opens new window)
  • JUC (opens new window)
  • JVM (opens new window)
  • Redis

    • Redis安装 (opens new window)
    • Redis基础 (opens new window)
    • Redis实战 (opens new window)
    • Redis集群安装 (opens new window)
    • Redis分布式缓存 (opens new window)
    • Redis多级缓存 (opens new window)
    • Redis原理 (opens new window)
  • 管理工具

    • Maven (opens new window)
    • Git (opens new window)
  • SSM

    • Spring (opens new window)
    • SpringBoot (opens new window)
    • Mybatis (opens new window)
    • MybatisPlus (opens new window)
  • 微服务

    • Docker (opens new window)
    • RabbitMQ (opens new window)
    • SpringCloud (opens new window)
    • Dubbo (opens new window)
    • MongoDB (opens new window)
    • Zookeeper (opens new window)
  • Java面试题 (opens new window)
  • JUC面试题 (opens new window)
  • JVM面试题 (opens new window)
  • Linux面试题 (opens new window)
  • SQL面试题 (opens new window)
  • Maven面试题 (opens new window)
  • Redis面试题 (opens new window)
  • SSM面试题 (opens new window)
  • SpringCloud面试题 (opens new window)
  • Linux (opens new window)
  • C++ (opens new window)
  • 数据库

    • MySQL (opens new window)
    • NoSQL (opens new window)
  • 软件测试

    • 软件测试 (opens new window)
  • 加密解密 (opens new window)
  • bilibili字幕提取 (opens new window)
  • 道理 (opens new window)
  • 关于博主

    • Github (opens new window)
    • CSDN (opens new window)
  • 关于本站

    • 如何搭建博客网站 (opens new window)
  • 简历项目
  • Java面试题

    • Java面试题
    • JUC面试题

    • JVM面试题

      • JVM组成
      • 类加载器
        • 类的生命周期
        • 什么是类加载器
        • 什么是双亲委派机制
        • 打破双亲委派机制
        • 说一下类装载的执行过程
      • 垃圾回收
      • JVM调优
      • 课后测试
    • Java集合面试题
  • 后端开发
  • 数据库面试题
  • Maven
  • MyBatis面试题
  • Spring面试题
  • SpringBoot面试题
  • SpringCloud面试题

  • Redis面试题

  • 设计模式
  • 中间件

  • 场景题
  • Other

  • Random

  • 项目面试题

  • 面试
  • Java面试题
  • JVM面试题
2025-04-03
0
0
目录

类加载器

# 类的生命周期

加载

验证

准备:给静态变量默认值、static final初始值、

解析

初始化

使用

销毁

# 什么是类加载器

类加载器(ClassLoader)的主要作用就是将字节码文件加载到JVM中,从而让Java程序能够启动起来。

启动类加载器(C++编写、jdk9后java)用于加载JAVA_HOME/jre/lib目录下的类库。

扩展类加载器、平台类加载器(jdk9)加载JAVA_HOME/jre/lib/ext目录中的类库。

应用程序类加载器:主要用于加载classPath下的类,也就是加载开发者自己编写的Java类。

自定义类加载器:重写findclass方法

# 什么是双亲委派机制

每一个类加载器都有一个父类加载器,形成一个层级结构

当一个类加载器接收到加载类的任务后,会查找这个类是否被加载过,没有则向上投递,直到启动类加载器,这个就是向上查找的过程,

如果启动类加载器也没有加载过,就检查该类是否在自己的加载路径上,没有则向下投递给下一个加载器加载,这个就是向下加载。这两个过程就是双亲委派机制,如果没有加载器能够加载,就抛出ClassNotFoundException

# 双亲委派机制的作用

​ 保证类加载的安全,如果要加载一个同名的String类,都会交给启动类加载,发现被加载过了就不会再加载,保证类库API不会被修改

​ 避免类的重复加载,保证唯一性。

# 打破双亲委派机制

打破双亲委派机制唯一方法是自定义类加载器中重写loadClass方法

# 说一下类装载的执行过程

类从加载到虚拟机中开始,直到卸载为止,它的整个生命周期包括了:加载、验证、准备、解析、初始化、使用和卸载这7个阶段。其中,验证、准备和解析这三个部分统称为连接(linking)。

1.加载

  • 通过类的全名,获取类的二进制数据流。
  • 解析类的二进制数据流为方法区内的数据结构(Java类模型)

2.验证

(1)文件格式验证:是否符合Class文件的规范

(2)元数据验证

​ 这个类是否有父类(除了Object这个类之外,其余的类都应该有父类)

​ 这个类是否继承(extends)了被final修饰过的类(被final修饰过的类表示类不能被继承)

​ 类中的字段、方法是否与父类产生矛盾。(被final修饰过的方法或字段是不能覆盖的)

(3)字节码验证

​ 主要的目的是通过对数据流和控制流的分析,确定程序语义是合法的、符合逻辑的。

(4)符号引用验证:符号引用以一组符号来描述所引用的目标,符号可以是任何形式的字面量

3.准备

  • static变量,分配空间在准备阶段完成(设置默认值),赋值在初始化阶段完成
  • static变量是final的基本类型,以及字符串常量,值已确定,赋值在准备阶段完成
  • static变量是final的引用类型,那么赋值也会在初始化阶段完成

4.解析

  • 把类中的符号引用转换为直接引用

5.初始化

对类的静态变量,静态代码块执行初始化操作

  • 如果初始化一个类的时候,其父类尚未初始化,则优先初始化其父类。
  • 如果同时包含多个静态变量和静态代码块,则按照自上而下的顺序依次执行。

6.使用

JVM 开始从入口方法开始执行用户的程序代码

  • 调用静态类成员信息(比如:静态字段、静态方法)
  • 使用new关键字为其创建对象实例

7.卸载

当用户程序代码执行完毕后,JVM 便开始销毁创建的 Class 对象,最后负责运行的 JVM 也退出内存

#面试#Java
上次更新: 2025/5/2 14:40:28
JVM组成
垃圾回收

← JVM组成 垃圾回收→

最近更新
01
项目优化
05-06
02
项目优化
05-06
03
延迟消息
05-05
更多文章>
Theme by Vdoing | Copyright © 2025-2025 Cyan Blog
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式