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

秋招突击——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文件,两个类也不相等。

总结

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

相关文章:

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

文章目录 引言类加载机制知识点复习类的生命周期1、加载2、连接——验证3、连接——准备4、连接——解析5、初始化 类加载器和类加载机制类加载器类加载机制——双亲委派模型 面试题整理1、类加载是什么2、类加载的过程是什么3、有哪些类加载器?4、双亲委派模型是什…...

如何在 Microsoft SQL Server 中增加字段-完整指南

在使用 Microsoft SQL Server (MSSQL) 进行数据库管理时,添加新字段(列)是一项常见的任务。无论你是需要存储额外的信息,还是调整数据模型以适应新的业务需求,本指南都将帮助你轻松完成这项操作。 目录 1. 使用 T-SQL 添加字段2. 使用 SQL Server Management Studio (SSMS) 添加…...

快手电商Android一面凉经(2024)

快手电商Android一面凉经(2024) 笔者作为一名双非二本毕业7年老Android, 最近面试了不少公司, 目前已告一段落, 整理一下各家的面试问题, 打算陆续发布出来, 供有缘人参考。今天给大家带来的是《快手电商Android一面凉经(2024)》。 面试职位: Android工程师 技术一面 面试形式…...

随机点名器

练习1 package lx;import java.io.*; import java.util.ArrayList; import java.util.Collections; import java.util.Random;/*需求:需求:有一个文件里面存储了班级同学的信息,每一个信息占一行。格式为:张三-男-23要求通过程序…...

添加动态云层

<template> <div class"topbox"> xx卫星管理 </div> <div class"selectbox"> <div class"title"> 卫星列表 </div> <el-table :data"tableData" style"width: 100%;height:230px;" …...

Spring Boot组成的分布式系统中实现日志跟踪

Spring Boot组成的分布式系统中实现日志跟踪 首发2024-07-25 08:54潘多编程 在分布式系统中&#xff0c;日志跟踪是一项非常重要的功能&#xff0c;它帮助开发者了解请求在整个系统中的流转过程&#xff0c;这对于调试、监控和故障排查至关重要。Spring Boot应用通常作为微服…...

GPT-4o Mini 模型的性能与成本优势全解析

GPT-4o Mini 模型的性能与成本优势全解析 &#x1f4c8; &#x1f31f; GPT-4o Mini 模型的性能与成本优势全解析 &#x1f4c8;摘要引言正文内容GPT-4o Mini 模型简介 &#x1f680;性能测试与对比 &#x1f4ca;应用场景 &#x1f310;自然语言处理对话系统内容生成 ✍️ &am…...

web前端 - HTML 基础知识大揭秘

HTML 大揭秘 什么是 HTML HTML&#xff08;Hyper Text Markup Language&#xff09;&#xff0c;中文译为超文本标记语言。其中&#xff0c;我们需要注意两个关键词。一个是 超文本&#xff0c;一个是 标记。所谓超文本&#xff0c;就是将不同空间的文字信息通过超链接的方式…...

HTML meta

<meta>标签用于提供html文档的元信息&#xff08;metadata&#xff09;。这些信息不会显示在页面上&#xff0c;但会被浏览器或搜索引擎用来识别页面的编码方式、关键字、描述、作者信息、刷新时间等。 基本语法 <meta name"属性名" content"属性值&q…...

【学习笔记】子集DP

背景 有一类问题和子集有关。 给你一个集合 S S S&#xff0c;令 T T T 为 S S S 的超集&#xff0c;也就是 S S S 所有子集的集合&#xff0c;求 T T T 中所有元素的和。 暴力1 先预处理子集的元素和 A i A_i Ai​&#xff0c;再枚举子集。 for(int s0; s<(1<…...

苦学Opencv的第十四天:人脸检测和人脸识别

Python OpenCV入门到精通学习日记&#xff1a;人脸检测和人脸识别 前言 经过了十三天的不懈努力&#xff0c;我们终于也是来到了人脸检测和人脸识别啦&#xff01;相信大家也很激动吧。接下来我们开始吧&#xff01; 人脸识别是基于人的脸部特征信息进行身份识别的一种生物识…...

PyTorch学习(1)

PyTorch学习&#xff08;1&#xff09; CIFAR-10数据集-图像分类 数据集来源是官方提供的&#xff1a; torchvision.datasets.CIFAR10()共有十类物品&#xff0c;需要用CNN实现图像分类问题。 代码如下&#xff1a;(CIFAR_10_Classifier_Self_1.py) import torch import t…...

三思而后行:计算机行业的决策智慧

在计算机行业&#xff0c;"三思而后行"这一原则显得尤为重要。在这个快速发展、技术不断更新换代的领域&#xff0c;每一个决策都可能对项目的成功与否产生深远的影响。以下是一篇关于在计算机行业中三思重要性的文章。 三思而后行&#xff1a;计算机行业的决策智慧 …...

Linux--Socket编程UDP

前文&#xff1a;Socket套接字编程 UDP协议特点 无连接&#xff1a;UDP在发送数据之前不需要建立连接&#xff0c;减少了开销和发送数据之前的时延。尽最大努力交付&#xff1a;UDP不保证可靠交付&#xff0c;主机不需要维持复杂的连接状态表。面向报文&#xff1a;UDP对应用层…...

《javaEE篇》--单例模式详解

目录 单例模式 饿汉模式 懒汉模式 懒汉模式(优化) 指令重排序 总结 单例模式 单例模式属于一种设计模式&#xff0c;设计模式就好比是一种固定代码套路类似于棋谱&#xff0c;是由前人总结并且记录下来我们可以直接使用的代码设计思路。 单例模式就是&#xff0c;在有…...

Java核心 - Lambda表达式详解与应用示例

作者&#xff1a;逍遥Sean 简介&#xff1a;一个主修Java的Web网站\游戏服务器后端开发者 主页&#xff1a;https://blog.csdn.net/Ureliable 觉得博主文章不错的话&#xff0c;可以三连支持一下~ 如有疑问和建议&#xff0c;请私信或评论留言&#xff01; 前言 Lambda表达式是…...

算法通关:006_1二分查找

二分查找 查找一个数组里面是否存在num主要代码运行结果 详细写法自动生成数组和num&#xff0c;利用对数器查看二分代码是否正确 查找一个数组里面是否存在num 主要代码 /*** Author: ggdpzhk* CreateTime: 2024-07-27*/ public class cg {//二分查找public static boolean …...

总结一些vue3小知识3

总结一些vue3小知识1&#xff1a;http://t.csdnimg.cn/C5vER 总结一些vue3小知识2&#xff1a;http://t.csdnimg.cn/sscid 1.限制时间选择器只能选择后面的日期 说明&#xff1a;disabled-date属性是一个用来判断该日期是否被禁用的函数&#xff0c;接受一个 Date 对象作为参…...

JAVAWeb实战(前端篇)

项目实战一 0.项目结构 1.创建vue3项目&#xff0c;并导入所需的依赖 npm install vue-router npm install axios npm install pinia npm install vue 2.定义路由&#xff0c;axios&#xff0c;pinia相关的对象 文件&#xff08;.js&#xff09; 2.1路由(.js) import {cre…...

axios请求大全

本文讲解axios封装方式以及针对各种后台接口的请求方式 axios的介绍和基础配置可以看这个文档: 起步 | Axios中文文档 | Axios中文网 axios的封装 axios封装的重点有三个&#xff0c;一是设置全局config,比如请求的基础路径&#xff0c;超时时间等&#xff0c;第二点是在每次…...

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…...

Java 语言特性(面试系列2)

一、SQL 基础 1. 复杂查询 &#xff08;1&#xff09;连接查询&#xff08;JOIN&#xff09; 内连接&#xff08;INNER JOIN&#xff09;&#xff1a;返回两表匹配的记录。 SELECT e.name, d.dept_name FROM employees e INNER JOIN departments d ON e.dept_id d.dept_id; 左…...

Prompt Tuning、P-Tuning、Prefix Tuning的区别

一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...

《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》

引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...

Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例

使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件&#xff0c;常用于在两个集合之间进行数据转移&#xff0c;如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model&#xff1a;绑定右侧列表的值&…...

Psychopy音频的使用

Psychopy音频的使用 本文主要解决以下问题&#xff1a; 指定音频引擎与设备&#xff1b;播放音频文件 本文所使用的环境&#xff1a; Python3.10 numpy2.2.6 psychopy2025.1.1 psychtoolbox3.0.19.14 一、音频配置 Psychopy文档链接为Sound - for audio playback — Psy…...

令牌桶 滑动窗口->限流 分布式信号量->限并发的原理 lua脚本分析介绍

文章目录 前言限流限制并发的实际理解限流令牌桶代码实现结果分析令牌桶lua的模拟实现原理总结&#xff1a; 滑动窗口代码实现结果分析lua脚本原理解析 限并发分布式信号量代码实现结果分析lua脚本实现原理 双注解去实现限流 并发结果分析&#xff1a; 实际业务去理解体会统一注…...

JS设计模式(4):观察者模式

JS设计模式(4):观察者模式 一、引入 在开发中&#xff0c;我们经常会遇到这样的场景&#xff1a;一个对象的状态变化需要自动通知其他对象&#xff0c;比如&#xff1a; 电商平台中&#xff0c;商品库存变化时需要通知所有订阅该商品的用户&#xff1b;新闻网站中&#xff0…...

通过 Ansible 在 Windows 2022 上安装 IIS Web 服务器

拓扑结构 这是一个用于通过 Ansible 部署 IIS Web 服务器的实验室拓扑。 前提条件&#xff1a; 在被管理的节点上安装WinRm 准备一张自签名的证书 开放防火墙入站tcp 5985 5986端口 准备自签名证书 PS C:\Users\azureuser> $cert New-SelfSignedCertificate -DnsName &…...

LangFlow技术架构分析

&#x1f527; LangFlow 的可视化技术栈 前端节点编辑器 底层框架&#xff1a;基于 &#xff08;一个现代化的 React 节点绘图库&#xff09; 功能&#xff1a; 拖拽式构建 LangGraph 状态机 实时连线定义节点依赖关系 可视化调试循环和分支逻辑 与 LangGraph 的深…...