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

news2024/9/25 1:23:30

文章目录

    • 引言
    • 类加载机制
      • 知识点复习
        • 类的生命周期
          • 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.coloradmin.cn/o/1945918.html

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

相关文章

FineBI连接MySQL5.7

一、在FineBI系统管理中,点击【新建数据库连接】 选择MySQL数据库 配置数据库连接,如下,其中数据库名称就是需要连接的目标数据库

STM32工业物联网系统教程

目录 引言环境准备工业物联网系统基础代码实现:实现工业物联网系统 4.1 数据采集模块 4.2 数据处理与分析模块 4.3 通信与网络系统实现 4.4 用户界面与数据可视化应用场景:工业监测与优化问题解决方案与优化收尾与总结 1. 引言 工业物联网&#xff08…

QCefView 在Clion+vs2022下编译

目录 QCefView 的编译Note下载代码方式一:可直接通过github下载方式二: csdn下载编译代码1. 解压文件2. 按照规定重新放置代码文件3. 将cef 的zip 放入CefViewCore中的dep文件夹内4. 使用Clion打开QCefView工程文件夹测试代码附QCefView 的编译 Note 需要使用VS2022 编译,VS…

配置linux客户端免密登录服务端linux主机的root用户

在192.168.30.129端口,对192.168.30.130端口进行免密登录 登录成功

[嵌入式Linux]-常见编译框架与软件包组成

嵌入式常见编译框架与软件包组成 1.嵌入式开发准备工作 主芯片资料包括: 主芯片资料 主芯片开发参考手册;主芯片数据手册;主芯片规格书; 硬件参考 主芯片硬件设计参考资料;主芯片配套公板硬件工程; 软件…

三分钟追踪工作流表单引擎几大优势

众所周知,企业都希望能实现开源节流。那么,如何实现这一目标是很多人都在思考的重要问题。低代码技术平台可操作性强、可视化界面丰富而简洁高效、灵活可靠,在推动企业流程化办公的过程中发挥了重要的市场价值和作用。本文将给大家介绍清楚低…

ROS小车设计问题记录

演示视频 问题小计 串口发送数据乱码IMU JY60 串口接收车轮测速电机调速 串口发送数据乱码 使用Send_User_Data()数据错误,数据帧输出为0x32;使用HAL_UART_Transmit_DMA()输出正确,数据帧输出为0x55。 解决: 将数组_data_to_sne…

vscode配置latex环境制作【文档、简历、resume】

vscode配置latex环境制作【文档、简历、resume】 1. 安装Tex Live及vscode插件 可以参考:vscode配置latex环境制作beamer ppt 2. 添加vscode配置文件 打开vscode,按下Ctrl Shift P打开搜索框,搜索Preference: Open User Settings (JSON…

[Linux]Mysql之主从同步

AB复制 一、主从复制概述 主从复制,是用来建立一个和主数据库完全一样的数据库环境,称为从数据库;主数据库一般是准实时的业务数据库。 主从复制的作用 1.做数据的热备,作为后备数据库,主数据库服务器故障后&#xf…

【人工智能】Transformers之Pipeline(五):深度估计(depth-estimation)

目录 一、引言 二、深度估计(depth-estimation) 2.1 概述 2.2 技术路径 2.3 应用场景 2.4 pipeline参数 2.4.1 pipeline对象实例化参数 2.4.2 pipeline对象使用参数 2.4 pipeline实战 2.5 模型排名 三、总结 一、引言 pipeline&#xff08…

【Stable Diffusion】AI生成新玩法:图像风格迁移

【Stable Diffusion】 AI生成新玩法:图像风格迁移 1 背景导入 你是否曾梦想过让自己融入梵高的星空之中 或是将一幅风景画赋予毕加索的立体主义之魂 还是把人物送进宫崎骏的动画世界? 下面让我们来看看如何通过 Stable Diffusion 实现在图像中玩…

本地部署,Whisper: 开源语音识别模型

目录 简介 特点 应用 使用方法 总结 GitHub - openai/whisper: Robust Speech Recognition via Large-Scale Weak SupervisionRobust Speech Recognition via Large-Scale Weak Supervision - openai/whisperhttps://github.com/openai/whisper 简介 Whisper 是一个由 O…

mysql面试(二)

前言 这是mysql面试基础的第二节,主要是了解一下mysql数据更新的基本流程,还有三大日志的作用。但是具体的比如undolog是如何应用在mvcc机制中的,由于篇幅问题就放在下一在章节 数据更新流程 上面是说了更新真正数据之前的大致流程&#x…

19023 砍树

这个问题可以通过二分查找来解决。我们可以设定一个范围&#xff0c;然后在这个范围内查找最大的高度&#xff0c;使得砍下的木材长度至少为M。 以下是C的解决方案&#xff1a; #include <iostream> #include <vector> #include <algorithm> using namespa…

解决R语言找不到系统库导致的报错

1、基本需知 1.1、系统库 系统库&#xff08;System library&#xff09;是一组预先编写和编译好的软件模块集合&#xff0c;用于支持操作系统的基本功能和提供一些常见的服务。这些库通常由操作系统或第三方开发者提供&#xff0c;并且在系统安装过程中被预装或者用户可以额…

【Linux】通过分配虚拟内存的方式来解决因内存不够而导致部署的项目自动挂掉

多个 jar 包项目部署在同一台服务器上&#xff0c;当服务器配置低&#xff0c;内存不足时&#xff0c;有可能出现 nohup java -jar 启动的进程就莫名其妙挂掉的问题。 解决方式&#xff1a; 第一种方法&#xff1a;进行JVM调优可以改善这种情况&#xff0c;但是项目太多&…

DNS域名管理系统、搭建DNS服务

1.DNS概述 1.DNS&#xff08;domain name system &#xff09; 域名管理系统 域名&#xff1a; 由特定的格式组成&#xff0c;⽤来表示互联⽹中某⼀台计算机或者计算机组的名称&#xff0c;能够使⼈更⽅便的访问互联⽹&#xff0c;⽽不⽤记住能够被机器直接读取的IP地址。 计算…

JS+H5可视化广度优先算法

源码在效果图后面 可标记 障碍 起始点 终点 点击寻路按钮后&#xff0c;表格上会自动出现一条蓝色最佳路径&#xff08;加了一格一格显示的动画&#xff09; 以下是效果图 橙色起点 绿色终点 红色障碍物 以下是寻路结果 源代码 <!DOCTYPE html> <html lang&quo…

「运费速查神器」精明买家必备!一键查询1688供应商发货费用

对于从事跨境买家还是国内电商买家&#xff0c;在选品时&#xff0c;需要全面考虑商品成本&#xff0c;发货费用是供应链成本的重要组成部分。 原来如果我们在1688选品看供应商发货运费&#xff0c;需要一个个单独点击到商品的详情页去查看&#xff0c;再选择具体的收货地、再…

【C# WInForm】将TextBox从输入框设置为文本框

1.需求情形&#xff1a; textbox作为最常用的控件之一&#xff0c;通常是用来输入文本信息或者显示文字&#xff0c;但是如果要在界面中显示大段文本&#xff0c;一个带有边框、可选中的文本样式似乎不合适。像这样&#xff1a; 我需要的是这段文字不仅能跨行&#xff0c;而且…