当前位置: 首页 > news >正文

JVM - 类加载,连接和初始化

目录

类加载和类加载器

概述

类加载要完成的功能

加载类的方式

类加载器

类加载器的关系

类加载器说明

双亲委派模型

工作过程如下:

双亲委派模型说明:

破坏双亲委派模型:

类连接和初始化

类连接主要验证的内容

类连接中的解析

类的初始化时机

类的卸载


  • 类加载和类加载器

  • 类从被加载到JVM开始,到卸载出内存,整个生命周期如图

  • 概述

  • 加载:
    • 查找并加载类文件的二进制数据
  • 连接:
    • 就是将已经读入内存的类的二进制数据合并到JVM运行时环境中去
    • 包含如下几个步骤:
      • (1)验证:确保被加载类的正确性
      • (2)准备:为类的静态变量分配内存,并初始化它们
      • (3)解析:把常量池中的符号引用转换成直接引用
  • 初始化:
    • 为类的静态变量赋初始值
  • 类加载要完成的功能

  • (1)通过类的全限定名来获取该类的二进制字节流
  • (2)把二进制字节流转化为方法区的运行时数据结构
  • (3)在堆上创建一个java.lang.Class对象,用来封装类在方法区内的数据结构,并向外提供了访问方法区内数据结构的接口
  • 加载类的方式

  • 最常见的方式:本地文件系统中加载、从jar等归档文件中加载
  • 动态的方式:将java源文件动态编译成class
  • 其它方式:网络下载、从专有数据库中加载等等
  • 类加载器

  • Java虚拟机自带的加载器包括如下几种:
  • 启动类加载器(BootstrapClassLoader)
  • 平台类加载器(PlatformClassLoader)(JDK8:扩展类加载器ExtensionClassLoader)
  • 应用程序类加载器(AppClassLoader)
  • 用户自定义的加载器,是java.lang.ClassLoader的子类,用户可以定制类的加载方式;只不过自定义类加载器其加载的顺序是在所有系统类加载器的最后
  • 类加载器的关系

  • 类加载器说明

  • 启动类加载器:用于加载启动的基础模块类
  • 比如:java.base、java.management、java.xml等等
  • 平台类加载器:用于加载一些平台相关的模块
  • 比如:java.scripting、java.compiler*、java.corba*等等
  • 应用程序类加载器:用于加载应用级别的模块
  • 比如:jdk.compiler、jdk.jartool、jdk.jshell等等;还加载classpath路径中的所有类库
  • JDK8:启动类加载器:
  • 负责将<JAVA_HOME>/lib,或者-Xbootclasspath参数指定的路径中的,且是虚拟机识别的类库加载到内存中(按照名字识别,比如rt.jar,对于不能识别的文件不予装载)
  • JDK8:扩展类加载器:
  • 负责加载<JRE_HOME>/lib/ext,或者java.ext.dirs系统变量所指定路径中的所有类库
  • JDK8:应用程序类加载器:
  • 负责加载classpath路径中的所有类库
  • Java程序不能直接引用启动类加载器,直接设置classLoader为null,默认就使用启动类加载器
  • 类加载器并不需要等到某个类“首次主动使用”的时候才加载它,Jvm规范允许类加载器在预料到某个类将要被使用的时候就预先加载它
  • 如果在加载的时候.class文件缺失,会在该类首次主动使用时报告LinkageError错误,如果一直没有被使用,就不会报错
  • 双亲委派模型

  • JVM中的ClassLoader通常采用双亲委派模型,要求除了启动类加载器外,其余的类加载器都应该有自己的父级加载器
  • 这里的父子关系是组合而不是继承
  • 工作过程如下:

    • (1)一个类加载器接收到类加载请求后,首先搜索它的内建加载器定义的所有“具名模块”
    • (2)如果找到了合适的模块定义,将会使用该加载器来加载
    • (3)如果class没有在这些加载器定义的具名模块中找到,那么将会委托给父级加载器,直到启动类加载器
    • (4)如果父级加载器反馈它不能完成加载请求,比如在它的搜索路径下找不到这个类,那子的类加载器才自己来加载
    • (5)在类路径下找到的类将成为这些加载器的无名模块
  • 双亲委派模型说明:

  • (1)双亲委派模型对于保证Java程序的稳定运作很重要
  • (2)实现双亲委派的代码在java.lang.ClassLoader的loadClass()方法中,如果自定义类加载器的话,推荐覆盖实现findClass()方法
  • (3)如果有一个类加载器能加载某个类,称为定义类加载器,所有能成功返回该类的Class的类加载器都被称为初始类加载器
  • (4)如果没有指定父加载器,默认就是启动加载器
  • (5)每个类加载器都有自己的命名空间,命名空间由该加载器及其所有父加载器所加载的类构成,不同的命名空间,可以出现类的全路径名相同的情况
  • (6)运行时包由同一个类加载器的类构成,决定两个类是否属于同一个运行时包,不仅要看全路径名是否一样,还要看定义类加载器是否相同;只有属于同一个运行时包的类才能实现相互包内可见
  • 破坏双亲委派模型:

  • 双亲模型有个问题:
    • 父加载器无法向下识别子加载器加载的资源
  • 为了解决这个问题
    • 引入了线程上下文类加载器,可以通过Thread的setContextClassLoader()进行设置
  • 另外一种典型情况就是实现热替换,比如OSGI的模块化热部署,它的类加载器就不再是严格按照双亲委派模型,很多可能就在平级的类加载器中执行了
  • 类连接和初始化

  • 类连接主要验证的内容

  • 类文件结构检查:
    • 按照JVM规范规定的类文件结构进行
  • 元数据验证:
    • 对字节码描述的信息进行语义分析,保证其符合Java语言规范要求
  • 字节码验证:
    • 通过对数据流和控制流进行分析,确保程序语义是合法和符合逻辑的;这里主要对方法体进行校验
  • 符号引用验证:
    • 对类自身以外的信息,也就是常量池中的各种符号引用,进行匹配校验
  • 类连接中的解析

  • 所谓解析就是把常量池中的符号引用转换成直接引用的过程
  • 包括:
  • 符号引用:
    • 以一组无歧义的符号来描述所引用的目标,与虚拟机的实现无关
  • 直接引用:
    • 直接指向目标的指针、相对偏移量、或是能间接定位到目标的句柄,是和虚拟机实现相关的
  • 主要针对:类、接口、字段、类方法、接口方法、方法类型、方法句柄、调用点限定符
  • 类的初始化时机

  • Java程序对类的使用方式分成:
  • 主动使用和被动使用
  • JVM必须在每个类或接口“首次主动使用”时才初始化它们
  • 被动使用类不会导致类的初始化
  • 主动使用的情况:
    • (1)创建类实例
    • (2)访问某个类或接口的静态变量
    • (3)调用类的静态方法
    • (4)反射某个类
    • (5)初始化某个类的子类,而父类还没有初始化
    • (6)JVM启动的时候运行的主类
    • (7)定义了default方法的接口,当接口实现类初始化时
  • 类的卸载

  • 当代表一个类的Class对象不再被引用,那么Class对象的生命周期就结束了,对应的在方法区中的数据也会被卸载
  • Jvm自带的类加载器装载的类,是不会卸载的,由用户自定义的类加载器加载的类是可以卸载的

相关文章:

JVM - 类加载,连接和初始化

目录 类加载和类加载器 概述 类加载要完成的功能 加载类的方式 类加载器 类加载器的关系 类加载器说明 双亲委派模型 工作过程如下&#xff1a; 双亲委派模型说明&#xff1a; 破坏双亲委派模型&#xff1a; 类连接和初始化 类连接主要验证的内容 类连接中的解析…...

[carla]关于odometry坐标中的角度坐标系 以及 到地图的映射问题

1.获取车辆的Odometry原始信息 在carla中&#xff0c;通过订阅/carla/ego_vecle/odometry 可以查看车辆的全局位置信息,例如&#xff1a; > header: seq: 118872stamp: secs: 5946nsecs: 5720187frame_id: "map" child_frame_id: "ego_vehicle" pos…...

Python 正则表达式

正则表达式主要用来查找和匹配字符串的。 一、正在表达式基础 字符 描述 示例 TIY\ 示意特殊序列&#xff08;也可用于转义特殊字符&#xff09;如&#xff1a;空白字符 "\s" . 任何字符&#xff08;换行符除外&#xff09; "he..o" ^ 起始于 "^h…...

spark03-读取文件数据分区数量个数原理

代码val conf: SparkConf new SparkConf().setMaster("local").setAppName("wordcount")val sc: SparkContext new SparkContext(conf)val rdd: RDD[String] sc.textFile("datas/1.txt",2)rdd.saveAsTextFile("output")数据格式 &a…...

操作系统(day08)内存

存储单元 内存的几个基本概念 存储单元 内存地址从0开始&#xff0c;每个地址对应一个存储单元 存储单元大小根据计算机按照什么方式编址 按字节编址 则每个存储单元大小为一字节&#xff0c;即1B&#xff0c;即8个二进制位按字编址 看这个计算的字长是多少位&#xff0c;如…...

11- 聚类算法 (KMeans/DBSCAN/agg) (机器学习)

聚类算法 聚类算法和降维算法那都属于无监督算法。KMeans 是以一个值为中心, 然后所有其他点到该点距离最小值的累积和。 kmeans KMeans(n_clusters3) # n_clusters 分类数量 kmeans.fit(data.iloc[:,1:]) # 无监督&#xff0c;只需要给数据X就可以 DBSCAN 算法是…...

日日顺供应链|想要看清供应链发展趋势,先回答这三个问题

技术变革如何支撑供应链及管理服务的发展&#xff1f; 数字化与科技化开始承托供应链管理能力的升级与变革&#xff1f; 如何从客户需求的纬度反推供应链及管理服务的模式变革&#xff1f;在过去的三年中&#xff0c;我国的供应链企业经受了最为极端的挑战&#xff0c;但当下&a…...

5守护进程与线程

进程组 多个进程的集合&#xff0c;第一个进程就是组长&#xff0c;组长进程的PID等于进程组ID。 进程组生存期&#xff1a;进程组创建到最后一个进程离开(终止或转移到另一个进程组)。与组长进程是否终止无关。 一个进程可以为自己或子进程设置进程组 ID 相关函数 pid_t …...

EZ-Cube简易款下载器烧写使用方法

一、硬件连接 跟目标芯片接4根线 VCC、GND、TOOL、REST 四根线&#xff0c;如果板子芯片自己外接电源的&#xff0c;VCC 线可以不接。 二、 安装烧写软件和驱动 烧写软件&#xff1a;https://download.csdn.net/download/Stark_/87444744?spm1001.2014.3001.5503 驱动程序&a…...

sql server安装并SSMS连接

博主简介&#xff1a;原互联网大厂tencent员工&#xff0c;网安巨头Venustech员工&#xff0c;阿里云开发社区专家博主&#xff0c;微信公众号java基础笔记优质创作者&#xff0c;csdn优质创作博主&#xff0c;创业者&#xff0c;知识共享者,欢迎关注&#xff0c;点赞&#xff…...

Python_pytorch (二)

python_pytorch 小土堆pytotch学习视频链接 from的是一个个的包&#xff08;package) import 的是一个个的py文件(file.py) 所使用的一般是文件中的类(.class) 第一步实例化所使用的类,然后调用类中的方法&#xff08;def) Torchvision 数据集 数据集使用&#xff08;CI…...

java手机短信验证,并存入redis中,验证码时效5分钟

目录 1、注册发送短信账号一个账号 2、打开虚拟机&#xff0c;将redis服务端打开 3、创建springboot工程&#xff0c;导入相关依赖 4、写yml配置 5、创建controller层&#xff0c;并创建controller类 6、创建service层&#xff0c;并创建service类 7、创建工具类&#x…...

kubectl命令控制远程k8s集群(Windows系统、Ubuntu系统、Centos系统)

文章目录1. 本地是linux2. 本地是Windows1. 本地是linux 安装kubectl命令 法一&#xff1a;从master的/usr/bin目录下拷贝kubectl文件到本机/usr/bin目录下法二&#xff1a;GitHub下载kubectl文件 在家目录下创建.kube目录config文件 法一&#xff1a;将master上对应用户的~/.…...

【求解器-COPT】COPT的版本更新中,老版本不能覆盖的问题

【求解器-COPT】COPT的版本更新中&#xff0c;老版本不能覆盖的问题方法1方法2如果license还是找不到作者&#xff1a;刘兴禄 参考网址&#xff1a; COPT的下载和配置步骤如下&#xff1a; 教程 | Windows系统下如何安装COPT求解器并配置许可文件&#xff1a; https://zhuan…...

Vue3.0文档整理:一、简介

1.1:什么是vue&#xff1f; Vue是一款用于构建用户界面的javascript框架&#xff1b;它基于标准HTML、CSS和Javascript构建&#xff0c;并提供了一套声明式、组件化的编程模型&#xff0c;帮助你高效的开发用户界面。 1.2&#xff1a;MVVM工作原理 MVVM指的是model、view和vie…...

vue2 diff算法及虚拟DOM

概括&#xff1a;diff算法&#xff0c;虚拟DOM中采用的算法&#xff0c;把树形结构按照层级分解&#xff0c;只比较同级元素&#xff0c;不同层级的节点只有创建和删除操作。 一、虚拟DOM (1) 什么是虚拟DOM&#xff1f; 虚拟 DOM (Virtual DOM&#xff0c;简称 VDOM) 是一种…...

Ray和极客们的创新之作,2月18日来发现

所在论坛&#xff1a;数据库技术创新&云原生论坛分享时段&#xff1a;2.18 10:30-11:00分享主题&#xff1a;云原生数据库PieCloudDB &#xff1a;Unbreakable安全特性剖析分享嘉宾&#xff1a;王淏舟&#xff0c;拓数派资深研发工程师 由中国开源软件推进联盟PostgreSQL分…...

Dubbo 源码分析 – 集群容错之 Router

1. 简介 上一篇文章分析了集群容错的第一部分 – 服务目录 Directory。服务目录在刷新 Invoker 列表的过程中&#xff0c;会通过 Router 进行服务路由。上一篇文章关于服务路由相关逻辑没有细致分析&#xff0c;一笔带过了&#xff0c;本篇文章将对此进行详细的分析。首先&…...

行人检测(人体检测)3:Android实现人体检测(含源码,可实时人体检测)

行人检测(人体检测)3&#xff1a;Android实现人体检测(含源码&#xff0c;可实时人体检测) 目录 行人检测(人体检测)3&#xff1a;Android实现人体检测(含源码&#xff0c;可实时人体检测) 1. 前言 2. 人体检测数据集说明 3. 基于YOLOv5的人体检测模型训练 4.人体检测模型…...

【图像分类】基于PyTorch搭建LSTM实现MNIST手写数字体识别(单向LSTM,附完整代码和数据集)

写在前面: 首先感谢兄弟们的关注和订阅,让我有创作的动力,在创作过程我会尽最大能力,保证作品的质量,如果有问题,可以私信我,让我们携手共进,共创辉煌。 提起LSTM大家第一反应是在NLP的数据集上比较常见,不过在图片分类中,它同样也可以使用。我们以比较熟悉的 mnist…...

应用升级/灾备测试时使用guarantee 闪回点迅速回退

1.场景 应用要升级,当升级失败时,数据库回退到升级前. 要测试系统,测试完成后,数据库要回退到测试前。 相对于RMAN恢复需要很长时间&#xff0c; 数据库闪回只需要几分钟。 2.技术实现 数据库设置 2个db_recovery参数 创建guarantee闪回点&#xff0c;不需要开启数据库闪回。…...

微软PowerBI考试 PL300-选择 Power BI 模型框架【附练习数据】

微软PowerBI考试 PL300-选择 Power BI 模型框架 20 多年来&#xff0c;Microsoft 持续对企业商业智能 (BI) 进行大量投资。 Azure Analysis Services (AAS) 和 SQL Server Analysis Services (SSAS) 基于无数企业使用的成熟的 BI 数据建模技术。 同样的技术也是 Power BI 数据…...

.Net框架,除了EF还有很多很多......

文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...

基于当前项目通过npm包形式暴露公共组件

1.package.sjon文件配置 其中xh-flowable就是暴露出去的npm包名 2.创建tpyes文件夹&#xff0c;并新增内容 3.创建package文件夹...

sqlserver 根据指定字符 解析拼接字符串

DECLARE LotNo NVARCHAR(50)A,B,C DECLARE xml XML ( SELECT <x> REPLACE(LotNo, ,, </x><x>) </x> ) DECLARE ErrorCode NVARCHAR(50) -- 提取 XML 中的值 SELECT value x.value(., VARCHAR(MAX))…...

Springcloud:Eureka 高可用集群搭建实战(服务注册与发现的底层原理与避坑指南)

引言&#xff1a;为什么 Eureka 依然是存量系统的核心&#xff1f; 尽管 Nacos 等新注册中心崛起&#xff0c;但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制&#xff0c;是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…...

Ascend NPU上适配Step-Audio模型

1 概述 1.1 简述 Step-Audio 是业界首个集语音理解与生成控制一体化的产品级开源实时语音对话系统&#xff0c;支持多语言对话&#xff08;如 中文&#xff0c;英文&#xff0c;日语&#xff09;&#xff0c;语音情感&#xff08;如 开心&#xff0c;悲伤&#xff09;&#x…...

OpenLayers 分屏对比(地图联动)

注&#xff1a;当前使用的是 ol 5.3.0 版本&#xff0c;天地图使用的key请到天地图官网申请&#xff0c;并替换为自己的key 地图分屏对比在WebGIS开发中是很常见的功能&#xff0c;和卷帘图层不一样的是&#xff0c;分屏对比是在各个地图中添加相同或者不同的图层进行对比查看。…...

鸿蒙DevEco Studio HarmonyOS 5跑酷小游戏实现指南

1. 项目概述 本跑酷小游戏基于鸿蒙HarmonyOS 5开发&#xff0c;使用DevEco Studio作为开发工具&#xff0c;采用Java语言实现&#xff0c;包含角色控制、障碍物生成和分数计算系统。 2. 项目结构 /src/main/java/com/example/runner/├── MainAbilitySlice.java // 主界…...

重启Eureka集群中的节点,对已经注册的服务有什么影响

先看答案&#xff0c;如果正确地操作&#xff0c;重启Eureka集群中的节点&#xff0c;对已经注册的服务影响非常小&#xff0c;甚至可以做到无感知。 但如果操作不当&#xff0c;可能会引发短暂的服务发现问题。 下面我们从Eureka的核心工作原理来详细分析这个问题。 Eureka的…...