博客
关于我
Netty源码—6.ByteBuf原理二
阅读量:797 次
发布时间:2023-02-15

本文共 1684 字,大约阅读时间需要 5 分钟。

ByteBuf问题整理

1. ByteBuf结构及重要API

ByteBuf在Netty中作为数据缓冲的核心类,采用了内存直接操作的方式,支持unsafe操作,提供了高效、灵活的内存管理功能。其关键API包括:

  • getByte(int index):读取指定位置的字节。
  • writeByte(int index, byte value):写入指定位置的字节。
  • capacity():返回缓冲区的容量。
  • capacity(int newCapacity):调整缓冲区容量。
  • clear():清空缓冲区。

2. ByteBuf的分类

ByteBuf主要分为以下几种类型:

  • UnpooledByteBuf:非池化的ByteBuf,内存分配靠直接new操作。
  • PooledByteBuf:池化的ByteBuf,内存分配通过PooledByteBufAllocator进行管理。
  • HeapByteBuf:基于堆内存分配的非池化ByteBuf。
  • DirectByteBuf:基于直接内存分配的非池化ByteBuf。
  • PooledHeapByteBuf:基于堆内存池化的ByteBuf。
  • PooledDirectByteBuf:基于直接内存池化的ByteBuf。
  • 3. ByteBuf分类的补充说明

    • UnpooledByteBuf适用于内存资源有限或需要频繁分配释放的场景。
    • PooledByteBuf通过PooledByteBufAllocator进行内存管理,支持内存回收和优化,适用于内存资源丰富的高性能需求场景。
    • HeapByteBufDirectByteBuf是UnpooledByteBuf的具体实现,前者基于堆内存,后者基于直接内存。
    • PooledHeapByteBufPooledDirectByteBuf是PooledByteBuf的具体实现,前者基于堆内存池,后者基于直接内存池。

    4. ByteBuf的主要内容分三大方面

  • 内存管理:通过ByteBufAllocator分配内存,支持池化和非池化操作。
  • 读写操作:提供高效的读写接口,支持直接操作内存。
  • 内存回收:支持自动内存回收,减少内存泄漏风险。
  • 5. 内存分配器ByteBufAllocator

    ByteBufAllocator负责内存的分配和管理,主要包括以下子类:

  • UnpooledByteBufAllocator
    • 使用unsafe操作分配内存。
    • 适用于非池化内存分配。
  • PooledByteBufAllocator
    • 支持内存池化,提高内存利用率。
    • 使用PoolThreadLocalCache和PoolArena进行内存管理。
  • 6. PoolArena内存分配流程

  • 获取PoolThreadCache:通过FastThreadLocal获取线程局部缓存。
  • 分配内存
    • HeapArena:分配堆内存。
    • DirectArena:分配直接内存。
  • 内存分配逻辑
    • 通过PoolThreadCache获取内存块。
    • 初始化PooledByteBuf对象。
    • 复用已有内存或分配新内存。
  • 7. PooledByteBufAllocator的结构

    • PoolThreadLocalCache:线程局部缓存,维护heapArena和directArena。
    • PoolArena数组
      • heapArenas:存储堆内存池。
      • directArenas:存储直接内存池。
    • 缓存机制
      • tinyCache:存储最小内存块。
      • smallCache:存储中等内存块。
      • normalCache:存储较大内存块。

    8. PoolArena内存分配流程详解

  • 获取内存池
    • 通过PoolThreadCache获取对应线程的heapArena或directArena。
  • 分配内存
    • 调用PoolArena的allocate方法。
    • 复用已有内存块或分配新内存。
  • 内存管理
    • 使用Recycler进行对象池化管理。
    • 支持内存回收和优化。
  • 通过以上机制,Netty的ByteBuf实现提供了高效、灵活的内存管理解决方案,适用于各种网络通信场景。

    转载地址:http://pvcfk.baihongyu.com/

    你可能感兴趣的文章
    NTPD使用/etc/ntp.conf配置时钟同步详解
    查看>>
    NTP及Chrony时间同步服务设置
    查看>>
    NTP配置
    查看>>
    NUC1077 Humble Numbers【数学计算+打表】
    查看>>
    NuGet Gallery 开源项目快速入门指南
    查看>>
    NuGet(微软.NET开发平台的软件包管理工具)在VisualStudio中的安装的使用
    查看>>
    nuget.org 无法加载源 https://api.nuget.org/v3/index.json 的服务索引
    查看>>
    Nuget~管理自己的包包
    查看>>
    NuGet学习笔记001---了解使用NuGet给net快速获取引用
    查看>>
    nullnullHuge Pages
    查看>>
    NullPointerException Cannot invoke setSkipOutputConversion(boolean) because functionToInvoke is null
    查看>>
    Numix Core 开源项目教程
    查看>>
    NumPy 或 Pandas:将数组类型保持为整数,同时具有 NaN 值
    查看>>
    numpy 或 scipy 有哪些可能的计算可以返回 NaN?
    查看>>
    numpy 数组 dtype 在 Windows 10 64 位机器中默认为 int32
    查看>>
    numpy 数组与矩阵的乘法理解
    查看>>
    NumPy 数组拼接方法-ChatGPT4o作答
    查看>>
    numpy 用法
    查看>>
    Numpy 科学计算库详解
    查看>>
    Numpy.fft.fft和numpy.fft.fftfreq有什么不同
    查看>>