广告
返回顶部
首页 > 资讯 > 精选 >Java NIO的ByteBuffer工作原理是什么
  • 106
分享到

Java NIO的ByteBuffer工作原理是什么

2023-06-15 07:06:08 106人浏览 薄情痞子
摘要

这篇文章给大家介绍Java NIO的ByteBuffer工作原理是什么,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。1 apiNetty 的数据处理 API 通过两个组件暴露——抽象类ByteBuf 和 接口 Byte

这篇文章给大家介绍Java NIO的ByteBuffer工作原理是什么,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。

1 api

Netty 的数据处理 API 通过两个组件暴露——抽象类ByteBuf 和 接口 ByteBufHolder。

ByteBuf API 的优点:

  • 它可以被用户自定义的缓冲区类型扩展

  • 通过内置的复合缓冲区类型实现了透明的零拷贝;

  • 容量可以按需增长(类似于 jdk 的 StringBuilder)

  • 在读和写这两种模式之间切换不需要调用 ByteBuffer 的 flip()方法

  • 读和写使用了不同的索引

  • 支持方法的链式调用

  • 支持引用计数

  • 支持池化

其他类可用于管理 ByteBuf 实例的分配,以及执行各种针对于数据容器本身和它所持有的数据的操作。

2 Netty 的数据容器

所有网络通信最终都是基于底层的字节流传输,因此高效、方便、易用的数据接口是迷人的,而 Netty 的 ByteBuf 生而为满足这些需求。

2.1 工作原理

ByteBuf 维护俩不同索引:一个用于读取,一个用于写入:

  • 从 ByteBuf 读取时,其 readerIndex 将会被递增已经被读取的字节数

  • 当写入 ByteBuf 时,writerIndex 也会被递增

  • 一个读索引和写索引都设置为 0 的 16 字节 ByteBuf

Java NIO的ByteBuffer工作原理是什么
Java NIO的ByteBuffer工作原理是什么

这些索引两两之间有什么关系呢?
若打算读取字节直到 readerIndex == writerIndex,会发生啥?此时,将会到达“可读取的”数据的末尾。类似试图读取超出数组末尾的数据一样,试图读取超出该点的数据也会抛 IndexOutOfBoundsException

Java NIO的ByteBuffer工作原理是什么

  • read、write 开头的 ByteBuf 方法,会推进对应索引

  • set、get 开头的操作则不会。后面的这些方法将在作为一个参数传入的一个相对索引上执行操作

可指定 ByteBuf 的最大容量。试图移动写索引(即 writerIndex)超过这个值将会触
发一个异常。(默认限制 Integer.MAX_VALUE。)

内存池化

非池化的堆内与堆外的 ByteBuf

示意图

Java NIO的ByteBuffer工作原理是什么

ByteBuf heapBuffer = UnpooledByteBufAllocator.DEFAULT.heapBuffer(10);ByteBuf directBuffer = UnpooledByteBufAllocator.DEFAULT.directBuffer(10);

注意要手动将GC 无法控制的非堆内存的空间释放:

池化的堆内与堆外的 ByteBuf

示意图

Java NIO的ByteBuffer工作原理是什么

Java NIO的ByteBuffer工作原理是什么

字节级操作

派生缓冲区

派生缓冲区为 ByteBuf 提供了以专门的方式来呈现其内容的视图。这类视图通过以下方法创建:

  • Unpooled.unmodifiableBuffer(…)

  • order(ByteOrder)

  • readSlice(int)

这些方法都将返回一个新的 ByteBuf 实例,但都具有自己独立的读、写和标记索引。
其内部存储和 JDK 的 ByteBuffer 一样,都是共享的。所以派生缓冲区的创建成本很低,但同时也表明若你修改了它的内容,也会同时修改对应源实例!

slice、slice(int, int)、retainedSlice、retainedSlice(int, int)

返回此缓冲区的可读字节的一部分
此方法与buf.slice(buf.readerIndex(), buf.readableBytes())相同。
该方法不会调用retain(),引用计数不会增加。
retainedSlice系列方法调用类似slice().retain(),但此方法可能返回产生较少垃圾的缓冲区实现。

Java NIO的ByteBuffer工作原理是什么

duplicate、retainedDuplicate

Java NIO的ByteBuffer工作原理是什么

返回一个共享该缓冲区整个区域的缓冲区。
此方法不会修改此缓冲区的readerIndex或writerIndex

Java NIO的ByteBuffer工作原理是什么

读取器和写入器标记将不会重复。
duplicate不会调用retain(),不会增加引用计数,而retainedDuplicate会。

readSlice、readRetainedSlice

Java NIO的ByteBuffer工作原理是什么

返回部分空间,彼此共享底层缓冲区,会增加原缓冲区的readerIndex。

如果需要一个现有缓冲区的真实副本,请使用 copy()或者 copy(int, int),因为这个调用所返回的 ByteBuf 拥有独立的数据副本。

引用与释放

ByteBuf 在使用完毕后一定要记得释放,否则会造成内存泄露。

引用计数

通过在某个对象所持有的资源不再被其他对象引用时释放该对象所持有的资源来优化内存使用和性能的技术。
Netty 在4.x为 ByteBuf 和 ByteBufHolder 带来了引用计数技术,都实现了:

ReferenceCounted接口

需要显式释放的引用计数对象。

当一个新的ReferenceCounted被实例化时,以1 作为初始值。

retain()

增加引用计数,将引用计数加1。只要引用计数>0,就能保证对象不会被释放。

release()

减少引用计数,将引用计数减1。若引用计数减少到0 ,对象将被显式释放,并且访问释放的对象通常会导致访问冲突。

若实现ReferenceCounted的对象是其他实现ReferenceCounted的对象的容器,则当容器的引用计数变为 0 时,所包含的对象也将通过release()被释放。

引用计数对于池化实现(如 PooledByteBufAllocator)很重要,它降低了内存分配的开销。

Channel channel = ...;// 从 Channel 获取 ByteBufAllocatorByteBufAllocator allocator = channel.alloc();...// 从 ByteBufAllocator 分配一个 ByteBufByteBuf buffer = allocator.directBuffer();// 检查引用计数是否为预期的 1assert buffer.refCnt() == 1;ByteBuf buffer = ...;// 减少该对象的活动引用。当减少到 0 时,该对象被释放,该方法返回 trueboolean released = buffer.release();

试图访问一个已经被释放的引用计数的对象,将会抛IllegalReferenceCountException

Java NIO的ByteBuffer工作原理是什么

Java NIO的ByteBuffer工作原理是什么

关于Java NIO的ByteBuffer工作原理是什么就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

--结束END--

本文标题: Java NIO的ByteBuffer工作原理是什么

本文链接: https://www.lsjlt.com/news/278696.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Java NIO的ByteBuffer工作原理是什么
    这篇文章给大家介绍Java NIO的ByteBuffer工作原理是什么,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。1 APINetty 的数据处理 API 通过两个组件暴露——抽象类ByteBuf 和 接口 Byte...
    99+
    2023-06-15
  • 一文学习Java NIO的ByteBuffer工作原理
    目录1 API2 Netty 的数据容器2.1 工作原理内存池化非池化的堆内与堆外的 ByteBuf池化的堆内与堆外的 ByteBuf字节级操作派生缓冲区slice、slice(in...
    99+
    2022-11-12
  • Java NIO的的介绍及工作原理是什么
    这篇文章主要讲解了“Java NIO的的介绍及工作原理是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java NIO的的介绍及工作原理是什么”吧!针对传统I/O 工作模式的不足,NIO...
    99+
    2023-06-17
  • Java NIO底层原理是什么
    这篇文章主要介绍“Java NIO底层原理是什么”,在日常操作中,相信很多人在Java NIO底层原理是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java NIO底层原理是什么”的疑惑有所帮助!接下来...
    99+
    2023-06-16
  • java servlet的工作原理是什么
    Java Servlet是一种用于在服务器上处理客户端请求的Java程序。它的工作原理如下:1. 客户端发送HTTP请求到服务器。这...
    99+
    2023-09-25
    java servlet
  • java session的工作原理是什么
    Java中的Session是一种用于在服务器端存储用户数据的机制。它的工作原理如下:1. 当用户第一次访问服务器时,服务器会为该用户...
    99+
    2023-09-20
    java
  • java servlet工作原理是什么
    Java Servlet是一种Java编程语言的类,用于扩展服务器功能的组件。它是在服务器端运行的,用于处理客户端请求并生成响应。S...
    99+
    2023-08-31
    java servlet
  • Java NIO Buffer实现原理是什么
    本篇内容介绍了“Java NIO Buffer实现原理是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1、Buffe...
    99+
    2023-06-21
  • java jbpm工作流的原理是什么
    jBPM(Java Business Process Management)是一个基于Java的开源工作流引擎,它用于执行和管理业务...
    99+
    2023-09-09
    java
  • Java工作流Activity的原理是什么
    Java工作流Activity的原理是基于活动(Activity)的概念。活动是业务中的具体操作或步骤,可以是一个服务、一个任务或者...
    99+
    2023-10-19
    Java
  • java activity工作流的原理是什么
    Java Activity工作流的原理是基于BPMN(Business Process Model and Notation)的标准...
    99+
    2023-10-10
    java
  • Java内存的原型及工作原理是什么
    这篇文章给大家介绍Java内存的原型及工作原理是什么,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。主要通过分析Java内存分配的栈、堆以以及常量池详细的讲解了其的工作原理。一、java虚拟机内存原型寄存器:我们在程序中...
    99+
    2023-06-17
  • Java 中substring()的工作原理是什么
    本篇文章给大家分享的是有关Java 中substring()的工作原理是什么,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。1、substring() 是干嘛...
    99+
    2023-06-16
  • java连接池的工作原理是什么
    连接池是一种管理数据库连接的技术,它在应用程序初始化时创建一定数量的数据库连接并保存在连接池中,应用程序需要数据库连接时,直接从连接...
    99+
    2023-09-13
    java
  • java过滤器的工作原理是什么
    Java过滤器的工作原理是基于Servlet规范中的过滤器接口(javax.servlet.Filter)来实现的。过滤器可以用于在...
    99+
    2023-08-26
    java
  • java虚拟主机的工作原理是什么
    Java 虚拟主机(Java Virtual Hosting,JVH)是一种基于 Java 技术的虚拟主机服务,其工作原理如下:1、...
    99+
    2023-03-20
    java虚拟主机 虚拟主机
  • ipsec的工作原理是什么
    IPSec(Internet Protocol Security)是一种用于保护网络通信安全的协议套件。它可以提供数据加密、数据完整...
    99+
    2023-10-10
    ipsec
  • HDFS的工作原理是什么
    这篇文章将为大家详细讲解有关HDFS的工作原理是什么,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。HDFS的工作原理HDFS支持在计算节点之间快速传输数据。在开始阶段,它与MapReduce紧密耦合——M...
    99+
    2023-06-05
  • chatgpt的工作原理是什么
    chatgpt的工作原理是以电子邮件和电子传真方式为用户提供多媒体信息传输,利用一个基于网络的、安全的点对点通讯系统为用户进行多人的...
    99+
    2023-02-09
    chatgpt
  • NTPD的工作原理是什么
    今天小编给大家分享一下NTPD的工作原理是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。Network Time Pro...
    99+
    2023-06-28
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作