【学习笔记】深入理解Java虚拟机学习笔记——第7章 虚拟机类加载机制

第7章 虚拟机类加载机制

7.1 概述

7.2 类加载的时机

JVM规范未规定类应在何时被加载

类初始化时机

1>其static方法或常量被引用,或new实例时

2>反射操作该类时

3>初始化一个类时,初始化其未初始化的父类

4>JVM启动时,初始化包含main方法的类

5>略,不懂

6>使用了default默认方法实现的接口与父类等同初始化

【子类引用父类的static字段,只会初始化父类,也就是直接定义字段的类】

【JVM会初始化一个类来包装任意一个类的数组对象,该类是由JVM自动创建】

【某些static字段,在编译时存入了常量池,因而在引用时不会出发类的初始化,直接从常量池中取了】

7.3 类加载的过程

7.3.1 加载

1>找到需要加载的二进制字节流(可通过重写方法自定义)

2>将class文件静态信息存入方法区

3>生成java.lang.Class类作为该class方法区数据入口

7.3.2 验证

1>文件格式验证

只有通过该验证才可证明该类可存储在方法区中

2>元数据验证

检查语法是否符合Java语言规范

3>字节码验证

检验方法执行时是否会损害JVM

4>符号引用验证

所引用是否无异常

7.3.3 准备

将static字段在方法区分配内存并初始化为零值

7.3.4 解析

将符号引用转换为直接引用(内存指针),由抽象转实际转换时会先加载所引用类,且检查是否有访问权限。

字段引用查找顺序:本身->接口->父类->失败

方法解析:本身->父类->接口(抽象)

接口解析:本身->接口

7.3.5 初始化

1>可以直接定义时复制或在static{ } 中赋值,初始化复制顺序与源文件出现顺序一致

2>可以在定义前赋值,但不可访问

3>类初始化前,父类一定会先执行初始化方法

4>类初始化方法只可执行一次,所以需加锁。

7.4 类加载器

功能:通过一个类的全限定名获取二进制字节流(class文件)

7.4.1 类与类加载机制

类与类加载器共同确定一个类,同一个class文件用不同的类加载器加载后便是不同的类,instance of等方法比较均会返回false

7.4.2 双亲委派模型

1>存在两种类加载器,启动类加载器或classloader及其子类加载器

当一个类加载器去加载类时,会优先使用(委派)父类去加载,因为不想程序中出现多个同名的类,(而类加载器不同),所以希望可以自下而上尽量让class文件使用同一个类加载器去加载。

7.4.3 破坏双亲委派模型

1>JDBC等由启动类加载器加载的类需要调用厂商提供的类,所以加载时只能使用子类加载器了。

2>模块化热部署场景

7.5 Java模块化系统

可配置的封装隔离机制

(JDK9之后内容略

相关推荐
小弥儿3 分钟前
GitHub今日热榜 | 2026-09-15:AI 智能体与本地生成工具领跑
学习·开源
老当益壮梁奶奶7 分钟前
51单片机DS18B20温度传感器详解:单总线时序与C51驱动实现
笔记·stm32·单片机·嵌入式硬件·51单片机
Flynt11 分钟前
Java 27 升级实测:默认值动得比新特性多,有个老参数会让 JVM 直接起不来
java·jvm·后端
Bs_MoneyMagnet12 分钟前
基于springboot+vue的个人健康管理系统的设计与实现 源码+文档
java·vue.js·spring boot·后端·vue3·springboot3·计算机毕业设计
susplus25 分钟前
【初识ARM】ARM相关基础概念
学习·arm
星云API技术支持34 分钟前
企业微信二次开发:群权限设置、成员管理与群资料维护的接口组合实践
java·前端·企业微信
XiHongShi201637 分钟前
键盘大小写指示器(代替键盘灯)
学习·计算机
niucloud-admin1 小时前
JAVA V6 多商户商城 开发文档——job 计划任务开发
java·python·github
小叶肥辉1 小时前
LangChain链和LangGraph图的学习笔记【三】——分别用langchain_openai库和langchain_community库调用大模型
笔记·python·langchain
海宇AI2 小时前
零信任架构实战:基于海宇柠檬查出险-登记证构建自动化车抵贷核保网关
java·人工智能·架构·自动化