秋招突击——7/24——知识补充——JVM类加载机制

文章目录

    • 引言
    • 类加载机制
      • 知识点复习
        • 类的生命周期
          • 1、加载
          • 2、连接——验证
          • 3、连接——准备
          • 4、连接——解析
          • 5、初始化
        • 类加载器和类加载机制
          • 类加载器
          • 类加载机制——双亲委派模型
      • 面试题整理
        • 1、类加载是什么
        • 2、类加载的过程是什么
        • 3、有哪些类加载器?
        • 4、双亲委派模型是什么
        • 5、如何判断两个类是否相等
    • 总结

引言

  • 在百度提前批面试中,第一个章节的问题关于类加载的相关知识点,忘得一干二净,这里整理一下!
    • 主要是类加载的过程还有双亲委派模型
  • 整理也是按照之前的惯例,先是基本的知识点,然后就是对应的面试题整理

类加载机制

知识点复习

类的生命周期
  • 类的生命周期如下,除了最后的使用和卸载,其他的基本上都很重要
    • 加载
    • 连接
      • 验证
      • 准备
      • 解析
    • 初始化
    • 使用
    • 卸载
  • 特征
    • 上述生命周期是按顺序开始,但是并不是按顺序完成
    • 通常一个阶段执行的过程中调用和激活另外一个阶段

在这里插入图片描述

1、加载
  • 类加载器主要完成三件事,分别是
    • 找到在哪里:通过一个类的全限定名,来获取定义此类的二进制字节流
    • 加载到方法区:将字节流所代表的静态存储结构转化为方法区的运行时数据结构
    • 创造对象提供入口:在内存中生成一个代表这个类的java.lang.Class对象,作为方法区这个类的各种数据的访问入口

在这里插入图片描述

2、连接——验证
  • 目的
    • 检查Class字节流,确保这个字节流是符合要求的,不会有安全性问题
  • 验证内容
    • 文件格式验证:版本号,还有开头的符号
    • 元数据验证:语义分析,是否符合Java语言规范,继承抽象类的类是否实现抽象方法等
    • 字节码验证:语义分析,数据流和控制流分析,程序是否合法或者符合逻辑等
    • 符号引用验证:对类中所引用的信息的匹配性校验(常量池中的各种符号引用)
      • 根据符号引用描述的名字能否找到对应的类
      • 符号引用的对象是否可被当前类访问

从文件格式,到语法规范,再到所引用对象

3、连接——准备
  • 目的
    • 为类的**静态变量(static修饰的)**分配内存,初始化为默认值,如果使用了final修饰,则会给初始值
  • 注意
    • 只给类变量分配内存,不给实例变量分配内存
    • 使用final修饰的static变量,会直接赋初始值,不会默认值
4、连接——解析
  • 目的
    • 将常量池中符号引用替换为直接引用
      • 符号引用
        • 是一组符号来描述所引用的目标,相当于是相对引用
      • 直接引用
        • 直接指向目标的指针、相对偏移量、或者一个能定位到目标的句柄
5、初始化
  • 目的

    • 类的静态变量赋初始值,不同于之前的准备,是给静态变量赋默认值
  • 初始化方式

    • 声明类变量指定初始值
    • 使用静态代码块指定初始值
  • 步骤

    • 如果这个类没有被加载或者连接,则程序先加载和连接这个类
    • 如果该类的直接父类没有被初始化,则先初始化其直接父类
    • 如果类中有这些初始化语句,则系统依次执行这些初始化语句
  • 类初始化的时机

  • 只有当类主动使用的时候,才会导致类的初始化,具体时机如下

    • 调用对应类的静态方法
    • 初始化某一个类的子类,父类也会被初始化
    • 创建类的实例
    • 使用反射
类加载器和类加载机制
类加载器
  • 类唯一性的确立

    • 一个类必须由加载他的类加载器和这个类本身一块共同确立其唯一性
  • 具体应用

    • 同一个Class文件加载的对象,可能调用getClass返回的都是同一个名字,但是如果类的加载器不同,instanceof返回的结果也是false

三个类加载器

  • 启动类加载器

    • 负责加载Java核心类库,是所有类加载器的顶层
    • 使用本地代码实现,依赖于操作系统的本地代码C++或者C
      • 无法通过Java代码直接获取到启动类加载器的实例
    • 核心类库
      • 运行时类库:rt.jar
      • 基础类:String、Object、System
  • 扩展类加载器

    • 负责加载标准扩展目录中的类和资源。
    • 使用Java代码实现,可以获取对应对象()了解
 ClassLoader extClassLoader = appClassLoader.getParent();System.out.println("Extension ClassLoader: " + extClassLoader);
  • 应用类加载器
    • 用户自定义类和第三方库的默认类加载器,加载应用程序类路径下的类库
ClassLoader appClassLoader = ClassLoader.getSystemClassLoader();
System.out.println("Application ClassLoader: " + appClassLoader);
类加载机制——双亲委派模型

在这里插入图片描述

  • 定义
    • 如果一个类加载器的收到了类加载的请求,首先不会尝试自己去加载这个类,而是把这个请求委托给父类加载器去完成
      • 所有的类加载请求,都应该传递到最顶层的启动类加载器中。
    • 只有当父加载器反馈自己无法完成这个加载请求时,子加载器才会尝试自己去完成加载

典型应用

  • 能不能自定义类加载器加载String类?
    • 不行
      在这里插入图片描述

面试题整理

1、类加载是什么
  • 类加载就是把Class文件中的类信息加载到虚拟机中,并形成可以被虚拟机使用的Java类型是类加载机制。

  • Java的运行期间动态加载和连接:Java中类型的加载、连接和初始化是在运行期间完成的,实现了Java的动态扩展性。

  • 一个类从加载到虚拟机再到卸载需要经历如下流程

    • 加载
    • 连接
      • 验证
      • 准备
      • 解析
    • 初始化
    • 使用
    • 卸载
2、类加载的过程是什么
  • 加载

    • 通过类的全限定名,找到对应二进制字节流文件
    • 将二进制字节流文件中的类的静态存储结构加载到方法区中,转为运行时数据。
    • 在堆区创建对应的Class对象,作为访问类信息的入口
  • 验证

    • 检查字节流,防止载入错误或者恶意的字节流文件,导致JVM崩溃
    • 验证流程:文本格式验证、符号引用验证、元数据验证、字节码验证等
  • 准备

    • 为类的静态变量分配内存,并赋默认值或者常量(final static修饰的)
  • 解析

    • 将符号引用替换为直接引用,能够直接指向引用对象句柄或者指针等
  • 初始化

    • 直到该阶段,JVM才开始执行类中编写的代码,根据程序员的编码对类的静态变量去赋值,
    • 执行类构造方法中的clinit方法
3、有哪些类加载器?
  • 有三层类加载器

启动类加载器

  • 在JVM启动时创建,加载最核心的类,如Object、String等,使用本地代码,由操作系统实现

扩展类加载器

  • 扩展类加载器,复杂加载一些扩展的系统类,比如XML、加密、网络编程等功能类

应用类加载器

  • 系统类加载器,是加载用户类路径上的类库,直接在代码中使用
  • 如果没有自定义类加载器,一般情况下,默认类加载器就是应用类加载器。
    • 自定义类加载器是通过继承ClassLoader并重写findclass实现的
4、双亲委派模型是什么
  • 类加载器具有等级制度,但不是继承关系,分层但非继承,以组合的方式,复用父加载器的功能。
    • 除了顶层的启动类加载器之外,其余类加载器都要用自己的父加载器

具体原理
* 一个类加载器收到类加载请求,不会自己去加载,而是把请求委派给父加载器。以此类推,最后所有请求都会到启动类加载器。
* 只有当父类加载器无法完成式,子类加载器才会去尝试加载

5、如何判断两个类是否相等
  • 确定一个类需要类自身的信息还有对应的加载器,共同确定唯一性。
  • 两个类只有由同一个类加载器加载才有比较意义
    • 如果不是同一个类加载器加载,即使来在同一个Class文件,两个类也不相等。

总结

  • 又攻克了一个难关,好好背一下,至少保证了以后在遇到类似的题目,基本上都能过了!
  • 今天本来是想看完垃圾回收机制的,但是晚上腰太疼了,就去推拿了,然后出去吃了点东西,回来的比较晚,剩下两个半小时,要把昨天的面经整理好的,就不看垃圾回收机制了!明天做个笔试,应该也不会刷题了,后续要出去旅游,请假三天!回来接着学!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/49529.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Redis一致性与分布式锁

Redis一致性 何为redis一致性 即在项目中,redis缓存中的数据要与数据库当中的数据保持一致。 那么这里,就会有小伙伴要问了,redis缓存中的数据不就是从数据库当中查询出来的吗?怎么会不一致呢? 笔者在这里解答一下…

Unite 上海 强势回归

​​​ 他回归了 Unite 大会是一年一度的 Unity 全球开发者盛会。今年,Unite 将于 7 月盛夏点亮上海外滩。此次盛会,我们将以“团结”为核心,凝聚全球 3000 多位 Unity 社区精英的力量,共同开启 Unity 技术的新纪元。 在这里&am…

样式迁移及代码

一、定义 1、使用卷积神经网络,自动将一个图像中的风格应用在另一图像之上,即风格迁移;两张输入图像:一张是内容图像,另一张是风格图像。 2、训练一些样本使得样本在一些cnn的特征上跟样式图片很相近,在一…

字典集合案例

1.统计字符 统计字符串中每个字符出现的次数 s l like summer very much #去掉空格 s s.replace(" ","") d dict() for i in s:if i in d:d[i] 1else:d[i] 1 for i in d:print(i,d[i]) 2.求不重复的随机数 #导入随机数 import random a int(input(&q…

被问到MQ消息已丢失,该如何处理?

在分布式系统中,消息中间件(如 RabbitMQ、RocketMQ、Kafka、Pulsar 等)扮演着关键角色,用于解耦生产者和消费者,并确保数据传输的可靠性和顺序性。尽管我们通常会采取多种措施来防止消息丢失,如消息持久化、…

【Vue实战教程】之 Vue Router 路由详解

Vue Router路由 1 路由基础 1.1 什么是路由 用Vue.js创建的项目是单页面应用,如果想要在项目中模拟出来类似于页面跳转的效果,就要使用路由。其实,我们不能只从字面的意思来理解路由,从字面上来看,很容易把路由联想…

HTML(五)——HTML区块,布局

HTML区块 HTML可以通过 <div> 和 <span>将元素组合起来&#xff0c;可以来布局&#xff0c;就是盒子&#xff0c;div是块级盒子&#xff0c;里面 可以放任何东西&#xff0c;span里面装的是文本 HTML 区块元素 大多数 HTML 元素被定义为块级元素或内联元素。 实…

Java 面试 | Redis

目录 1. 在项目中缓存是如何使用的&#xff1f;2. 为啥在项目中要用缓存&#xff1f;3. 缓存如果使用不当会造成什么后果&#xff1f;4. redis 和 memcached 有什么区别&#xff1f;5. redis 的线程模型是什么&#xff1f;6. 为什么单线程的 redis 比多线程的 memcached 效率要…

dns逆向解析,主从服务,多域名访问(穿插ntp服务器)

复习 域名解析&#xff1a; 正向解析&#xff1a;将域名解析为ip 反向解析&#xff1a;将ip解析为域名 逆向解析 关闭防火墙和selinux&#xff0c;配置静态ip [rootdns ~]# vim /etc/named.rfc1912.zones [rootdns ~]# vim /etc/named.conf [rootdns ~]# cd /var/named/ [rootd…

前端:Vue学习-4

前端&#xff1a;Vue学习-4 1. 组件缓存 keep-alive2. 状态管理工具 - Vuex2.1 vuex 提供数据&使用数据 - mapState2.2 mutations 修改数据 - mapMutations2.3 actions - 异步操作 - mapActions2.4 getters - 计算属性 - mapGetters 3. Vuex 模块 modules - state,mutation…

day07:用户下单、订单支付

文章目录 地址薄相关相关代码需求分析和设计代码书写 用户下单需求分析和设计代码开发 订单支付微信支付介绍微信支付准备工作如何保证数据安全&#xff1f;如何调用到商户系统 地址薄相关相关代码 需求分析和设计 产品原型接口设计数据库设计 代码书写 地址薄相关代码都是单…

视频行业(监控,直播,会议,视频通话)痛点,随时接入,异构融合,以OvMeet视频会议为中心解决企业视频应用完美解决方案

近年来随着网络的普及及音视频技术的不断发展&#xff0c;以全球化、网络化、智能化未趋势的办公方式越来越受到各行各业的青睐。视频会议解决方案的应用转往多种交互式视频应用&#xff0c;如转往视频接入融合&#xff0c;调度与管理、日常沟通、工作部署、紧急救援、作战指挥…

誉天Cloud Service Solutions Architect(云服务)怎么样

誉天云服务课程亮点 深度融合云原生 包含原生K8s和docker内容&#xff0c;引入isito和ASM功能进行微服务治理&#xff0c;结合Linux功底设计云上性能优化&#xff0c;和架构设计。师资力量强大 课程由两名5HCIE认证讲师授课&#xff0c;认证辅导由已通过HCIE-Cloud Service专职…

【图形图像-1】SDF

在图形图像处理中&#xff0c;SDF&#xff08;Signed Distance Field&#xff0c;带符号的距离场&#xff09;是一种表示图形轮廓和空间距离的数学结构。它通常用于计算机图形学、文本渲染、碰撞检测和物理模拟等领域。 SDF&#xff08;Signed Distance Field&#xff0c;带符号…

《中国数据库前世今生》观影——认识1980年起步阶段

引出 中国数据库的前世今生观影——认识1980年的起步阶段 20 世纪 60 年代国外就有了商业数据库&#xff0c;20 世纪 80 年代我国才有了第一批数据库专业人才。不要小看这 20 年的差距&#xff0c;它可能需要几代数据库人用一生去追。2024 年了&#xff0c;中国跨过数据库这座大…

搞DDR你必须得看看我的这篇笔记

Hi! 这篇约你一起深入认识一下DDR。 文章目录 DDR基础DDR是什么?DDR有什么用?为什么要用DDRDDR协议是如何演进的如何访问DDRDDR关键时序参数ACTIVATE Timing 激活时序REFRESH Timing 刷新时序READ Timing 读时序写时序模式寄存器时序DDR基础 DDR是什么? 如果你在学生时代自…

动态创建标签jQuery效果

动态创建标签jQuery效果https://www.bootstrapmb.com/item/14832 使用jQuery来动态创建HTML标签并添加效果是一种常见的方法。以下是一个简单的示例&#xff0c;说明如何使用jQuery来动态创建<div>标签&#xff0c;并给它们添加一些基本的效果。 1. 创建一个新的<di…

3GPP眼中的XR及其技术特点

3GPP R18 支持了XR Services。XR需要高数据速率和低延迟通信&#xff0c;这也真是5G可以大展身手的地方。这篇就从3GPP的角度看下XR是什么以及XR有哪些技术特点。 Extended Reality (XR) 是指由计算机技术和可穿戴设备生成的所有现实与虚拟相结合的环境和人机交互技术。 实际上…

使用vscode搜索打开的文件夹下的文件

右键空白处打开命令面板 摁一次删除键&#xff0c;删除掉图中的大于号 这样就能够找到例化的模块&#xff0c;文件具体在哪个位置&#xff0c;然后打开了

python实现责任链模式

把多个处理方法串成一个list。下一个list的节点是上一个list的属性。 每个节点都有判断是否能处理当前数据的方法。能处理&#xff0c;则直接处理&#xff0c;不能处理则调用下一个节点&#xff08;也就是当前节点的属性&#xff09;来进行处理。 Python 实现责任链模式&#…