JVM类加载机制

2023-05-16

类加载过程3个阶段:

1.加载

  • 将类的字节码载入方法区,并创建.Class对象
    • 加载符号引用到类常量池,只是有这个名字
    • UnresolvedClass: $Name
  • 如果类的父类没有加载,先加载父类
  • 加载懒惰执行

2.链接

  • 验证-验证类是否符合Class规范,合法性、安全性检查
  • 准备-为static变量分配空间赋予默认值,和final修饰静态变量赋值。
  • 解析-将常量池的符合引用解析为直接引用
    • 把需要用到的符号引用进行初始化,变成直接的地址引用
    • Class: Class xx.xxx.Test$Name @0x00000ac11

3.初始化

  • 执行静态代码块与非final的静态变量赋值,或者被final修饰的引用类型
  • 初始化是懒惰执行

准备阶段变量问题

类中的全局变量:

  • 两次赋初始值的过程
  • 一次是准备阶段:分配空间赋默认值,二次是初始化阶段:赋予由程序员在代码中定义的值。
  • final 修饰的变量,直接分配空间赋初始值。

方法体中局部变量:

  • 只有在初始化阶段赋值,如果没有赋值。就是不能使用的。

解析阶段引用解析问题

  • 类或接口的解析
  • 类方法的解析
  • 接口方法解析
  • 字段解析

常见发生异常:

  • NoSuchFieldError 根据继承关系从下往上,找不到相关字段
  • IllegalAccessError:字段或方法访问权限不具备时。
  • NoSuchMethodError:找不到相关方法错误。

初始化阶段成员变量问题

class A{
	static int a=0;
	static{
		a=1;
		b=1;
	}
	static int b=0;
	
	main(){
		System.out.println(a); //  1
		System.out.println(b); //  0
	}
}
  • static语句块只能访问定义在static语句块之前的变量
    • 编译字节码时 会顺序执行
  • final static 修饰基本数据类型,会复制一份到需要的类中,调用时直接获取,不用经过定义它的原始类。
    • 数值小直接写在方法中
    • 数值超过最大值就写在常量池中
  • JVM保证子类初始化方法执行前,父类的初始化方法已经执行完毕。
    • 父类的static语句块优于子类的
    • 父类构造方法优于子类的

双亲委派机制

类加载器:

  • 一级类加载器 Bootstrap ClassLoader
  • 二级类加载器 Extension ClassLoader
  • 三级类加载器 Application ClassLoader
  • 自定义类加载器

双亲委派:优先委派上级类加载器加载

  • 如果上级类加载器能找到这个类,则由上级加载,加载后对下级加载器可见。
  • 找不到这个类,则下级加载器才有权限加载。

哪些东西打破双亲委派机制

  1. Tomcat:Shared类加载器、WebApp类加载器、JSP类加载器
    • WebAPPClassLoader加载自己目录下的.class文件,不会先交给Shared类加载器。
    • 但是可以访问到Shared类加载器加载的类,实现共享和分离。
  2. SPI机制(Service Provider Interface):用于框架的扩展和替换组件
    • 会在META-INF/services目录下创建一个接口全限定名为命名的文件,里面保存实现类的全限定名。
    • 基于接口编程+策略模式+配置文件的动态加载机制,ServiceLoader动态加载。
    • ServiceLoader最后采用当前线程上下文的类加载器。应用程序类加载器来加载第三方驱动。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JVM类加载机制 的相关文章

随机推荐

  • Android9.0从系统层面修改android_id

    原因 按照android官方说明 xff0c android id会随着恢复出厂设置或重新烧录系统 xff0c 或切换用户登陆都会重新随机生成新的anroid id 因此对于一些依赖anroid id做唯一识别标识之一的软件来说就有问题了
  • Linux系统下基于Docker安装Yapi,并且迁移Yapi数据

    本文主要讲四个部分 xff1a 1 什么是Yapi 2 Centos7 下基于docker安装Yapi 3 Yapi数据迁移 4 利用Nginx反向代理 什么是Yapi YApi 是高效 易用 功能强大的 api 管理平台 xff0c 旨在
  • C语言多文件编程基本格式

    1 背景 xff1a 用一个丢骰子的简单案例熟悉了C语言多文件编程该咋写 2 格式 xff08 1 xff09 主函数文件main c 文件头part1 所有要使用的函数 include include include 文件头part2 放
  • STM32汇编程序及点灯实验

    目录 一 Keil下编写汇编程序1 新建工程2 配置环境3 测试代码 二 HEX文件格式说明1 简介2 格式说明3 举例说明 上述工程生成的 hex文件 三 基于STM32 汇编每间隔1秒钟闪烁一次LED的程序 一 Keil下编写汇编程序
  • c++单向链表逆序

    include lt iostream gt using namespace std struct node int data node next node createlist int n 创建一个链表 xff0c n为存储的数据个数 n
  • 目标检测6--NanodetPlus算法分析

    文章目录 1 简介2 辅助训练模块Assign Guidance Module3 损失函数4 标签匹配策略5 后处理介绍6 特征融合参考资料 欢迎访问个人网络日志 x1f339 x1f339 知行空间 x1f339 x1f339 1 简介
  • Couldn't find executable named map_saver below /opt/ros/indigo/share/map_server

    在使用 Mastering ROS for Robotics Programming PACKT 2015 学习ros xff0c 学习到第四章的时候 xff0c 先是安装Navigation一直找不到dependencies 换了源进行u
  • Linux之索引节点inode(index node)

    inode就是索引节点 xff0c 它用来存放档案及目录的基本信息 xff0c 包含时间 档名 使用者及群组等 inode 是 UNIX Linux 操作系统中的一种数据结构 xff0c 其本质是结构体 它包含了与文件系统中各个文件相关的一
  • String、StringBuffer、Stringbulider的区别

    java中用于处理字符串常用的有三个类 java lang String java lang StringBuffer java lang StrungBuilder 三者共同之处 都是final类 不允许被继承 xff0c 主要是从性能和
  • 常用集合List、Set、Map的比较

    概述 List Set Map都是接口 xff0c 前两个继承至Collection接口 xff0c Map为独立接口 List有序 xff0c 可重复 1 ArrayList 底层 xff1a 数组 xff1b 查询快 xff0c 增删慢
  • Apache中的默认编码

    好吧 xff0c 在Django上测试挺好的GBK编码的静态文件 xff0c 部署到Apache后乱码了 xff0c 默认编码变成了UTF 8 xff0c 可是meta中明明指定了charset为GBK的 xff1a lt meta htt
  • SpringDoc使用

    文章目录 1 SpringDoc简介2 SpringDoc基础使用 1 SpringDoc简介 SpringDoc是一款可以结合SpringBoot使用的API文档生成工具 2 SpringDoc基础使用 POM文件 span class
  • Result统一响应数据

    目录 1 响应数据的格式 1 1 状态码划分 1 3 响应数据的封装 2 统一数据返回 1 响应数据的格式 在分离的环境中 xff0c 我们前后交互就显得尤为重要 前端按照接口文档中的URL地址和参数要求发送请求 xff0c 接着后端对业务
  • SpringBoot实现全局异常处理器

    1 本文使用 64 ControllerAdvice 64 ExceptionHandler 进行全局的 Controller 层异常处理 不用在 Controller 层进行 try catch xff01 package com exa
  • 排序算法的对比

    冒泡排序VS选择排序 两者时间复杂度O n2 冒泡排序找最大值放在最后 xff0c 选择排序找最小值放在前面 选择排序属于不稳定排序 xff1b 选择排序一般情况下优于冒泡排序 xff0c 每轮只交换一次 如果集合有序度高 xff0c 则选
  • Redis基本操作

    安装Redis docker compose安装 单节点 version 34 3 3 34 services master image redis 6 0 container name redis environment 34 disco
  • RabbitMQ初级操作

    MQ 消息队列 xff1a 一种进程通信或同一进程的不同线程的通信方式 采用链表结构实现 xff0c 拥有权限的进程向消息队列写入或读取消息 常用MQ xff1a RabbitMQ ActiveMQ kafka xff0c Redis的Li
  • SpringBoot——邮件模块

    SpringBoot集成邮件模块 邮件协议 原文链接 xff1a https blog csdn net qq 37745470 article details 89094227 什么是SMTP xff1f SMTP全称为Simple Ma
  • JVM内存结构

    JVM JVM xff1a Java Virtual Machine xff0c Java虚拟机 xff0c 识别 class后缀文件 xff0c 解析class的指令 xff0c 调用操作系统函数完成操作 JVM JRE JDK关系 xf
  • JVM类加载机制

    类加载过程3个阶段 xff1a 1 加载 将类的字节码载入方法区 xff0c 并创建 Class对象 加载符号引用到类常量池 xff0c 只是有这个名字UnresolvedClass Name 如果类的父类没有加载 xff0c 先加载父类加