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

最清楚的 BIO、NIO、AIO 详解!

一、什么是 I/O?

 I/O 描述了计算机系统与外部设备(磁盘)之间通信的过程。

为了保证操作系统的稳定性和安全性,一个进程的地址空间划分为 用户空间(User space) 和 内核空间(Kernel space ) 。用户进程(应用程序)想要执行 IO 操作的话,必须通过 系统调用 来间接访问内核空间。

当应用程序发起 I/O 调用后,会经历两个步骤:

  1. 内核等待 I/O 设备准备好数据——阶段①
  2. 内核将数据从内核空间拷贝到用户空间——阶段②

二、同步与异步、阻塞与非阻塞

阻塞与非阻塞是针对 线程 来说的;同步与异步是针对 整个I/O操作 来说的

同步阻塞IO(BIO):应用程序发起请求后,需等待阶段①和②都完成,在整个IO期间不能做别的,必须等待整个IO操作完成才可进行下个任务。

同步非阻塞IO:应用程序发起请求后,在阶段①不断轮询内核数据是否准备好,在阶段②需阻塞等待,在整个IO期间不能做别的,必须等待整个IO操作完成才可进行下个任务。

异步阻塞IO:应用程序发起请求后,立刻返回,在等待阶段①和②期间也不做别的(因为阻塞挂起当前线程),就等着内核通知。内核完成①和②之后,发起回调,应用程序可以直接处理数据。

异步非阻塞IO(AIO):应用程序发起请求后,立刻返回,在等待阶段①和②期间做别的事。内核完成①和②之后,发起回调,应用程序可以直接处理数据。

简述JAVA同步、异步、阻塞和非阻塞之间的区别_java_脚本之家 (jb51.net)

什么是阻塞和非阻塞?什么是同步和异步?什么是BIO、NIO、AIO? - 沙滩de流沙 - 博客园 (cnblogs.com)

三、 I/O 多路复用模型 (NIO)

同步非阻塞IO的应用程序不断进行 I/O 系统调用轮询数据是否已经准备好的过程是十分消耗 CPU 资源的。

IO 多路复用模型,通过减少无效的系统调用,减少了对 CPU 资源的消耗。

IO 多路复用模型中,线程首先发起 select 调用(阶段①),询问内核数据是否准备就绪(一个线程管理多个客户端连接,也就是在这期间询问每个连接),等内核把数据准备好了(某一个连接),用户线程再发起 read 调用(阶段②)。read 调用的过程(数据从内核空间->用户空间)还是阻塞的。


四、深入理解

同步与异步(是谁通知消息

  • 同步: 发起一个调用后,被调用者未处理完请求之前,调用不返回。需要反复询问数据是否就绪。

  • 异步: 发起一个调用后,立刻得到被调用者的回应表示已接收到请求,但是被调用者并没有返回结果,此时我们可以处理其他的请求,被调用者通常依靠事件,回调等机制来通知调用者其返回结果。

同步和异步的区别最大在于——异步是被调用者来通知调用者处理结果。同步需要调用者自己反复询问处理结果。

阻塞和非阻塞(线程等待消息通知时的可不可以做别的事

  • 阻塞: 发起一个请求,调用者一直等待请求结果返回,无法从事其他任务,只有当条件就绪才能继续。

  • 非阻塞: 发起一个请求,调用者不用一直等着结果返回,可以先去干其他事情。

同步非阻塞 和 异步非阻塞 区别

  • 同步阻塞 是自己发起之后,就一直等待处理结果。
  • 同步非阻塞 是自己等待消息通知,需自己反复询问处理结果。
  • 异步非阻塞 是别人通过事件或回调机制来通知自己,自己不需要询问

BIO(Socket 网络编程)

  1. 同步阻塞I/O
  2. 一请求一线程
  3. 面向流(Stream)。数据直接读写到 Stream 对象中。
  4. 不适合高并发场景

在 Java 虚拟机中,线程是宝贵的资源,线程的创建和销毁成本很高,除此之外,线程的切换成本也是很高的。

痛点

  1. 处理多个客户端请求,就必须使用多线程。如果这个连接不做任何事情的话就会造成不必要的线程开销。线程开销大。线程之间的切换也会浪费资源开销。
  2. 如果并发访问量增加会导致线程数急剧膨胀可能会导致线程堆栈溢出、创建新线程失败等问题,最终导致进程宕机或者僵死,不能对外提供服务。

优化(伪异步IO)

  1. 可以通过 线程池机制 改善。当有新的客户端接入时,将客户端的 Socket 封装成一个Task(该任务实现java.lang.Runnable接口)投递到后端的线程池中进行处理,JDK 的线程池维护一个消息队列和 N 个活跃线程,对消息队列中的任务进行处理。由于线程池可以设置消息队列的大小和最大线程数,因此,它的资源占用是可控的,无论多少个客户端并发访问,都不会导致资源的耗尽和宕机。
  2. 避免了为每个请求都创建一个独立线程造成的线程资源耗尽问题。不过因为它的底层任然是同步阻塞的BIO模型,因此无法从根本上解决问题。

NIO(SocketChannel 网络编程)

  1. I/O 多路复用模型
  2. 多通道一线程
  3. 面向缓冲区。所有数据读写到缓冲区。
  4. 三大核心组件:
    • Buffer(缓冲区)。在NIO厍中,所有数据都是用缓冲区处理的。在读取数据时,它是直接读到缓冲区中的; 在写入数据时,写入到缓冲区中。任何时候访问NIO中的数据,都是通过缓冲区进行操作。
    • Channel(通道)。NIO 通过Channel(通道) 进行读写。通道是双向的,可读也可写,而流的读写是单向的。无论读写,通道只能和Buffer交互。因为 Buffer,通道可以异步地读写。
    • Selector(选择器)。NIO的选择器用于使用单个线程管理多个通道只有在通道里真正有读写事件发生时(事件驱动),才会交给线程读写(Selector会一直询问每个通道有没有读写事件,这个过程是同步的),因此,它只需要较少的线程来处理这些通道。不必为每一个连接都创建一个线程,也不必去维护多个线程。避免了多个线程之间的上下文切换,导致资源的浪费。(只有网络IO才会使用选择器,文件IO是不需要使用的)
  5. 适合高并发场景

痛点

  1. NIO的类库和API繁杂,学习成本高。
  2. 需要熟悉Java多线程编程。这是因为NIO编程涉及到Reactor模式,你必须对多线程和网络编程非常熟悉,才能写出高质量的NIO程序。
  3. JDK 的 NIO 底层由 epoll 实现,该实现饱受诟病的空轮询 bug 会导致 cpu 飙升 100%

当我们调用socket.read()、socket.write()这类阻塞函数的时候,这类函数不能立即返回,也无法中断,需要等待socket可读或者可写,才会返回,因此一个线程只能处理一个请求。在这等待的过程中,cpu并不干活,(即阻塞住了),那么cpu的资源就没有很好地利用起来。因此对于这种情况,我们使用多线程来提高cpu资源的利用率:在等待的这段时间,就可以切换到别的线程去处理事件,直到socket可读或可写了,通过中断信号通知cpu,再切换回来继续处理数据。例如线程A正在等待socket可读,而线程B已经就绪了,那么就可以先切换到线程B去处理。虽然上下文切换也会花一些时间,但是远比阻塞在线程A这里空等要好。当然计算机内部实际的情况比这复杂得多。

而NIO的读写函数可以立刻返回,这就给了我们不开线程利用CPU的最好机会:如果一个连接不能读写(socket.read()返回0或者socket.write()返回0),我们可以把这件事记下来。因此只需要一个Selector不断地轮询这些事件,一旦有就绪的时间,处理即可。不需要多线程。

AIO

  1. 异步非阻塞I/O
  2. 异步 IO 是基于事件和回调机制实现的,也就是应用操作之后会直接返回(发起请求后,线程直接返回干别的事,这个过程是异步的,只要等待操作完成后,通知该线程),不会堵塞在那里,当后台处理完成,操作系统会通知相应的线程进行后续的操作。

痛点

  1. 复杂性:虽然AIO的编程模型相对简单,但是由于其非阻塞的特性,编程复杂性可能会增加。例如,需要处理操作完成的通知,以及可能的并发问题。
  2. 资源消耗:AIO可能会消耗更多的系统资源。因为每个操作都需要创建一个回调函数,如果并发连接数非常大,可能会消耗大量的系统资源。
  3. 可移植性:AIO在某些平台上可能不可用或者性能不佳。因此,如果需要跨平台的可移植性,可能需要考虑使用其他I/O模型。

BIO适合连接数目较少且固定的架构。

NIO适合连接数目多,但是并发读写操作相对较少的场景。

AIO则适合连接数目多,且并发读写操作也多的场景。

五、思考题

看看你现在能回答这些问题了吗?

  • 简单说下 BIO、NIO 和 AIO?具体使用、区别及原理?
  • BIO,NIO,AIO的痛点,怎么优化?
  • 为什么BIO比NIO性能差?简单讲讲区别?
  • 假设有100个连接,采用NIO的方式要服务端要分配几个线程,采用BIO的方式呢?

阿里毕玄-测试Java编程能力-我的回答(一)_java bio建立100个连接-CSDN博客

  • 为啥要用异步IO不用多线程,不是一样可以加速吗?
  • NIO的设计架构?JDK中NIO有哪些重要组件?
  • 同步、异步调用方式的具体实现

相关文章:

最清楚的 BIO、NIO、AIO 详解!

一、什么是 I/O? I/O 描述了计算机系统与外部设备(磁盘)之间通信的过程。 为了保证操作系统的稳定性和安全性,一个进程的地址空间划分为 用户空间(User space) 和 内核空间(Kernel space &…...

八股文学习第二天| HTTP请求报文和响应报文是怎样的,有哪些常见的字段?,HTTP有哪些请求方式?,GET请求和POST请求的区别?

1、HTTP请求报文和响应报文是怎样的,有哪些常见的字段? 答: HTTP报文分为请求报文和响应报文。 (1) 请求报文 请求报文主要由请求行、请求头、空行、请求体构成。 请求行包括如下字段: 方法&#xff08…...

C++初阶学习第四弹——类与对象(中)

目录 一. 类的默认成员函数 二.六种默认成员函数 1、构造函数 1.1 构造函数的作用 1.2 特性 1.3 默认构造函数 2、析构函数 2.1 析构函数的作用 2.2 析构函数的用法 3、拷贝构造函数 3.1 拷贝构造函数的作用 3.2 特征 3.3 默认拷贝构造函数 三.总结 类与对象&…...

【计算机网络】期末实验答辩

注意事项: 1)每位同学要在下面做过的实验列表中选取三个实验进行答辩准备,并将自己的姓名,学号以及三个实验序号填入共享文档"1(2)班答辩名单"中。 2)在答辩当日每位同学由老师在表…...

一步步教你学会如何安装VMare虚拟机(流程参考图)

前言:一步步教你安装VMare虚拟机(此版本为17.5。2版本)。 1、安装 2、确认协议 3、选择位置存放 4、选择第二个 5、都不选。 6、都选提供便捷操作 7、点击许可证,将密钥输入(可以在网络寻找自己版本的密钥&#xff…...

WebGoC题解(14) 151.(2017dloi小乙)第5题 巧克力甜度(sweet)

题目描述 妈妈买了n颗甜度不同的巧克力,规定小C只能吃最大甜度之和是S。 例如:有5颗巧克力,s6,每个的甜度分别为: 4 2 3 1 1,那么小C最多可以吃3颗。 请问你能帮小C计算一下最多能吃多少颗巧克力吗? 输入格…...

深入探索PHP框架:Symfony框架全面解析

1. 引言 在现代Web开发领域,PHP作为一种广泛使用的服务器端脚本语言,其框架的选择对于项目的成功至关重要。PHP框架不仅能够提高开发效率,还能确保代码的质量和可维护性。本文将深入探讨Symfony框架,这是一个功能强大且灵活的PHP…...

内卷的利与弊

“内卷”原指一类文化模式达到了某种最终的形态以后,既没有办法稳定下来,也没有办法转变为新的形态,而只能不断地在内部变得更加复杂的现象。经网络流传,很多大学生用其来指代非理性的内部竞争或“被自愿”竞争。现指同行间竞相付…...

用Java手写jvm之实现查找class

写在前面 完成类加载器加载class的三阶段,加载,解析,初始化中的加载😀😀😀 源码 。 jvm想要运行class,是根据类全限定名称来从特定的位置基于类加载器来查找的,分别如下:…...

【React】组件:全面解析现代前端开发的基石

文章目录 一、什么是组件?二、组件的类型三、组件的生命周期四、状态管理五、属性传递六、组合与继承七、最佳实践 在现代前端开发中,React 已成为开发者构建用户界面的首选框架之一。React 的强大之处在于其组件化设计,允许开发者将 UI 拆分…...

java学习--包装类

包装类 Boolean的关系图 Character关系图 其他关系图 包装类和基本数据转换 Debug进入之后可以看到底层代码如下 例题: 三元运算符是一个整体返回的数的类型看其中所含类型最高的那个是谁就会转成哪个 想要掌握这个这个知识,就要多看源码,直接…...

Python Django功能强大的扩展库之channels使用详解

概要 随着实时 web 应用程序的兴起,传统的同步 web 框架已经无法满足高并发和实时通信的需求。Django Channels 是 Django 的一个扩展,旨在将 Django 从一个同步 HTTP 框架转变为一个支持 WebSockets、HTTP2 和其他协议的异步框架。它不仅能够处理传统的 HTTP 请求,还可以处…...

推荐3款将相片变为动漫风格的免费AI工具推荐

toonme ToonMe是一款功能强大的在线和移动端应用,专门用于将照片转换成卡通风格图像。该工具利用先进的AI技术,能够快速识别照片中的面部特征,并进行智能处理,生成高清晰度的卡通肖像。 功能特点 ToonMe通过其内置的人工智能算法…...

【职业学习】高效工作法

文章目录 01 时间拳击02 非同步沟通03 批量处理04. 80/20法则05. 一次只做一件事 01 时间拳击 时间拳击(Time Boxing)核心是给每项任务创造一个时间限制,然后在固定的时间段内专注地完成这个任务。 不同于传统的待办事项清单:8点…...

【iOS】Tagged Pointer

目录 前言什么是Tagged Pointer?引入Tagged Pointer技术之前引入Tagged Pointer之后总结 Tagged Pointer原理(TagData分析)关闭数据混淆MacOS分析NSNumberNSString iOS分析 判断Tagged PointerTagged Pointer应用Tagged Pointer 注意点 Tagge…...

Mysql explain 优化解析

explain 解释 select_type 效率对比 MySQL 中 EXPLAIN 语句的 select_type 列描述了查询的类型,不同的 select_type 类型在效率上会有所差异。下面我们来比较一下各种 select_type 的效率: SIMPLE: 这是最简单的查询类型,表示查询不包含子查询或 UNION 操作。 这种查询通常是…...

wget下载github文件得到html文件

从github/gitee下载源文件,本来是22M下载下来只有11k 原因: Github会提供html页面,包括指定的文件、上下文与相关操作。通过wget或者curl下载时,会下载该页面 解决方式: github点击Code一栏的raw按钮,获得源…...

【es】elasticsearch 自定义排序-按关键字位置排序

一 背景 要求es查询的结果按关键字位置排序,位置越靠前优先级越高。 es版本7.14.0,项目是thrift,也可以平替springboot,使用easyes连接es。 二 easyes使用 配easyes按官方文档就差不多了 排序 | Easy-Es 主要的一个问题是easy…...

堆的相关知识点

目录 大小堆 堆的实现 堆的创建 堆的销毁 交换 向上调整 向下调整 弹出首个元素 取出首个元素 判空 堆插入 大小堆 大堆:最上面的数字是最小的,越往下越大 小堆:最上面的数字是最大的,越往下越小 堆的复杂程度&#…...

【Sass】常用全局sass高级函数,可使用原子化CSS减轻代码量,方便快速开发

文章目录 前言一、安装二、样式custom.scssflex.scsscolor.scssmargin-padding.scssorther 总结 前言 提示:这里可以添加本文要记录的大概内容: 针对style的预编译器为scss 转载自git前端知识库 原博主是B站up程序员郑清,可以看他的v3教程…...

MYSQL 第四次作业

任务要求: 具体操作: 新建数据库: mysql> CREATE DATABASE mydb15_indexstu; Query OK, 1 row affected (0.01 sec) mysql> USE mydb15_indexstu; Database changed 新建表: mysql> CREATE TABLE student( ->…...

depcheck 前端依赖检查

介绍 depcheck 是一款用于检测项目中 未使用依赖项 的工具。 depcheck 通过扫描项目文件,帮助你找出未被引用的依赖,从而优化项目。 优势: 简单易用: 仅需几个简单的命令,就能够扫描并列出未使用的依赖项,让你快速了…...

Qt/C++音视频开发79-采集websocket视频流/打开ws开头的地址/音视频同步/保存到MP4文件/视频回放

一、前言 随着音视频的爆发式的增长,各种推拉流应用场景应运而生,基本上都要求各个端都能查看实时视频流,比如PC端、手机端、网页端,在网页端用websocket来接收并解码实时视频流显示,是一个非常常规的场景,单纯的http-flv模式受限于最大6个通道同时显示,一般会选择ws-f…...

网络安全等级保护制度1.0与2.0的演进与变革

等保1.0概述 等保1.0是我国在网络安全领域迈出的重要一步,它于2008年正式发布。该版本的等保制度以《信息安全技术 信息系统安全等级保护基本要求》为核心标准,主要聚焦于信息系统的物理安全、网络安全、主机安全、应用安全和数据安全等方面的基础防护。…...

多线程优化API请求:CountDownLatch与PriorityBlockingQueue的应用

目录 前言 CountDownLatch是什么? PriorityBlockingQueue是什么? 场景描述 解决方案 定义统一工厂制造类 定义制造厂 定义客户请求实现 定义控制器 定义启动类 结果呈现 启动项目 请求制造操作 总结 前言 写这篇文章的缘由是因为之前在面…...

谷粒商城实战笔记-54-商品服务-API-三级分类-拖拽效果

文章目录 一,54-商品服务-API-三级分类-修改-拖拽效果1,el-tree控件加上允许拖拽的属性2,是否允许拖拽3,完整代码 一,54-商品服务-API-三级分类-修改-拖拽效果 本节的主要内容是给三级分类树形结构加上拖拽功能&#…...

AI大模型学习必备十大网站

随着人工智能技术的快速发展,AI大模型(如GPT-3、BERT等)在自然语言处理、计算机视觉等领域取得了显著的成果。对于希望深入学习AI大模型的开发者和研究者来说,找到合适的学习资源至关重要。本文将为大家推荐十大必备网站&#xff…...

Elasticsearch:Golang ECS 日志记录 - zap

ECS 记录器是你最喜欢的日志库的格式化程序/编码器插件。它们可让你轻松地将日志格式化为与 ECS 兼容的 JSON。 编码器以 JSON 格式记录日志,并在可能的情况下依赖默认的 zapcore/json_encoder。它还处理 ECS 错误格式的错误字段记录。 默认情况下,会添…...

关于线性代数(考研)

1.AE的特征值的问题 若λ是A的特征值,对应的特征向量是x,则Axλx,所以(AE)xAxExλxx(λ1)x,所以λ1是AE的特征值。所以若A的特征值是1,1,0,则AE的特征值就是11,11,01&am…...

【java基础】spring springMVC springboot 的区别

Spring, Spring MVC, 和 Spring Boot 是三个紧密相关的技术,它们都是由 Pivotal 团队(原SpringSource)开发的,主要用于构建企业级的Java应用程序。尽管它们在功能上有所交集,但各自也有独特的定位和用途。 Spring Fra…...

【2024最新华为OD-C/D卷试题汇总】[支持在线评测] 开源项目热度排行榜(100分) - 三语言AC题解(Python/Java/Cpp)

🍭 大家好这里是清隆Coding ,一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为OD-C/D卷的三语言AC题解 👏 感谢大家的订阅➕ 和 喜欢💗 🍿 最新华为OD机试D卷目录,全、新、准,题目覆盖率达 95% 以上,支持题目在线评测,专栏文章质量平均 93 分 最新华为OD机试目录…...

大模型算法面试题(十一)

本系列收纳各种大模型面试题及答案。 1、说一下目前主流或前沿的预训练模型,包括nlp(百度ERNIE3.0,华为NEZHA,openAI gpt-3,nvidia MegatronLM,macrosoft T5)和cv(我只知道CLIP&…...

CSS 基础知识

CSS(级联样式表)是设置 Web 内容样式的代码。CSS 基础知识将介绍入门所需的内容。我们将回答以下问题:如何将文本设置为红色?如何使内容显示在(网页)布局中的某个位置?如何用背景图片和颜色装饰我的网页? 什么是CSS? 像HTML一样,CSS不是一种编程语言。它也不是一种标…...

IntelliJ IDEA 和 Eclipse的区别

IntelliJ IDEA 和 Eclipse 是两个非常流行的 Java 集成开发环境(IDE),它们各自具有不同的特点和优势。下面是它们之间的一些主要对比: 性能和资源使用 IntelliJ IDEA 被认为在某些方面更加智能,能够提供更好的代码分…...

Ansible之playbook剧本编写(二)

tags 模块 可以在一个playbook中为某个或某些任务定义“标签”,在执行此playbook时通过ansible-playbook命令使用--tags选项能实现仅运行指定的tasks。 playbook还提供了一个特殊的tags为always。作用就是当使用always作为tags的task时,无论执行哪一个t…...

力扣第二十九题——两数相除

内容介绍 给你两个整数,被除数 dividend 和除数 divisor。将两数相除,要求 不使用 乘法、除法和取余运算。 整数除法应该向零截断,也就是截去(truncate)其小数部分。例如,8.345 将被截断为 8 ,-…...

解析三款热门的文献翻译工具:优势与使用指南

今儿咱们来聊聊那些让咱们头疼又不得不面对的事儿——文献翻译。在浩瀚的学术海洋里遨游时,遇到外文文献那是家常便饭,但语言障碍就像海上的迷雾,一不小心就能让你偏离航向。别担心,我这不就带着几款亲测好用的文献翻译神器来了嘛…...

git 过滤LFS文件下载

git config --global filter.lfs.smudge "git-lfs smudge --skip -- %f" git config --global filter.lfs.process "git-lfs filter-process --skip" 恢复下载 git config --global filter.lfs.smudge "git-lfs smudge -- %f" git config --g…...

内存泄漏详解

文章目录 什么是内存泄漏内存泄漏的原因排查及解决内存泄漏避免内存泄漏及时释放资源设置合理的变量作用域及时清理不需要的对象避免无限增长避免内部类持有外部类引用使用弱引用 什么是内存泄漏 内存泄漏是指不使用的对象持续占有内存使得内存得不到释放,从而造成…...

多角度解析高防CDN防御DDOS及CC攻击

网络攻击的形式也日益多样化,其中DDoS(分布式拒绝服务)和CC(Challenge Collapsar)攻击尤为突出,给网站和企业带来了巨大的安全威胁。高防CDN(Content Delivery Network)作为一种专业…...

(7) cmake 编译C++程序(二)

文章目录 概要整体代码结构整体代码小结 概要 在ubuntu下,通过cmake编译一个稍微复杂的管理程序 整体代码结构 整体代码 boss.cpp #include "boss.h"Boss::Boss(int id, string name, int dId) {this->Id id;this->Name name;this->DeptId …...

C语言系统调用linux文件系统

在C语言中,open、write和read函数是系统调用(system calls),它们直接由操作系统提供,用于底层的文件操作。这些函数是UNIX和类UNIX系统(如Linux)中的标准接口,不同于C标准库中的文件…...

LeetCode142 环形链表 II

前言 题目: 142. 环形链表 II 文档: 代码随想录——环形链表 II 编程语言: C 解题状态: 思路错误,链表不允许被修改 思路 两步走,第一步,判断有没有环,第二步,判断入环口…...

逆向案例二十八——某高考志愿网异步请求头参数加密,以及webpack

网址:aHR0cDovL3d3dy54aW5nYW9rYW90Yi5jb20vY29sbGVnZXMvc2VhcmNo 抓包分析,发现请求头有参数u-sign是加密的,载荷没有进行加密,直接跟栈分析。 进入第二个栈,打上断点,分析有没有加密位置。 可以看到参数…...

WebKit的文本装饰艺术:CSS Text Decoration全解析

WebKit的文本装饰艺术:CSS Text Decoration全解析 CSS文本装饰(Text Decoration)是一组用于美化和增强网页文本表现的属性,它们可以为文本添加下划线、上划线、线删除和强调标记等效果。WebKit作为许多现代浏览器的渲染引擎&…...

【linux】Shell脚本三剑客之sed命令的详细用法攻略

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全…...

解析class字节码文件获取魔数和版本号

写在前面 本文看下如何获取class字节码文件的魔数和版本号信息。 1:正文 需要对class字节码的结构有一定的了解,可以参考这篇文章 。 直接看代码: package org.example;import java.math.BigInteger;public class TTTT {//取部分字节码&…...

技术文档总结----思维导图

性能调优| ProcessOn免费在线作图,在线流程图,在线思维导图 mysql| ProcessOn免费在线作图,在线流程图,在线思维导图 kafka| ProcessOn免费在线作图,在线流程图,在线思维导图 mybatis缓存| ProcessOn免费在线作图,在线流程图,在线思维导图 java锁| ProcessOn免费在线作图,在…...

【iOS】—— retain\release实现原理和属性关键字

【iOS】—— retain\release实现原理和属性关键字 1. retain\reelase实现原理1.1 retain实现原理1.2 release实现原理 2. 属性关键字2.1 属性关键字的分类2.2 内存管理关键字2.2.1 weak2.2.2 assgin2.3.3 strong和copy 2.4 线程安全的关键字2.5 修饰变量的关键字2.5.1常量const…...

这一文,关于Java泛型的点点滴滴 一

作为一个 Java 程序员&#xff0c;用到泛型最多的&#xff0c;我估计应该就是这一行代码&#xff1a; List<String> list new ArrayList<>();这也是所有 Java 程序员的泛型之路开始的地方啊。 不过本文讲泛型&#xff0c;先不从这里开始讲&#xff0c;而是再往前…...