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

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

Netty内存管理深入解析

Netty作为一个高性能的异步I/O框架,其内存管理机制至关重要。优化内存分配和管理能够显著提升应用性能和稳定性。本文将深入探讨Netty的内存分配机制,包括Page级别和SubPage级别的内存分配流程, PoolChunk的内存组织方式,以及内存回收机制。


1. Netty的内存规格

Netty的内存管理基于Page和SubPage两种规格。Page通常为8KB(8192字节),而SubPage则为16字节。这种规格化设计使得内存管理更加高效,能够根据具体需求灵活分配内存。


2. 缓存数据结构

Netty采用了双层缓存机制:一种是基于Page的内存缓存,另一种是基于SubPage的内存缓存。Page缓存主要用于大块内存的管理,而SubPage缓存则用于小块内存的高效分配。


3. 命中缓存的分配流程

3.1 Page级别内存分配的入口

在实际使用中,Page级别的内存分配通常通过以下代码实现:

PooledByteBufAllocator allocator = PooledByteBufAllocator.DEFAULT;ByteBuf byteBuf = allocator.heapBuffer(8192); // 分配8192B内存byteBuf.release();

3.2 Page级别内存分配的流程

  • 尝试在现有的PoolChunk上分配

    PoolArena中的PoolChunkList通过双向链表连接,每个PoolChunkList代表一种内存使用率的池。PoolArena的allocateNormal()方法会尝试从各个PoolChunkList中获取可用的PoolChunk。

  • 创建一个PoolChunk并进行内存分配

    如果无法从现有PoolChunk中获取,PoolArena会调用newChunk()方法创建一个新的PoolChunk,并调用其allocateRun()方法进行内存分配。

  • 初始化PooledByteBuf对象

    PoolChunk的initBuf()方法会根据分配的内存handle初始化PooledByteBuf对象,设置其内存映射和偏移量。

  • 将新建的PoolChunk添加到PoolChunkList中

    PoolChunk会被添加到PoolArena的qInit PoolChunkList中,等待下次分配使用。


  • 4. SubPage级别内存分配

    4.1 SubPage级别内存分配的入口

    SubPage级别的内存分配通常通过以下代码实现:

    PooledByteBufAllocator allocator = PooledByteBufAllocator.DEFAULT;ByteBuf byteBuf = allocator.directBuffer(16); // 分配16B内存byteBuf.release();

    4.2 SubPage级别内存分配的流程

  • 定位一个SubPage对象

    PoolArena的findSubpagePoolHead()方法会根据内存大小找到对应的SubPage池。

  • 初始化SubPage对象

    如果SubPage池中没有可用的SubPage,会创建一个新的PoolSubpage对象,并初始化其位图和内存映射。

  • 调用SubPage的allocate()方法进行分配

    PoolSubpage的allocate()方法会从位图中寻找未使用的SubPage,并返回对应的handle。


  • 5. ByteBuf的回收

    5.1 池化的内存如何释放

    当ByteBuf被释放时,PooledByteBuf的deallocate()方法会清空相关handle和内存映射,并调用PoolArena的free()方法。

    5.2 将连续内存的区段加到缓存

    PoolArena的freeChunk()方法会将释放的内存区段添加到缓存,并标记为未使用。

    5.3 标记连续内存的区段为未使用

    Page级别的内存管理通过二叉树结构标记内存为未使用,而SubPage级别则通过位图标记。


    6. 将ByteBuf对象添加到对象池

    PooledByteBuf对象在释放后不会立即销毁,而是会被添加到对象池中以供复用。这种机制减少了GC压力,提升了性能。

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

    你可能感兴趣的文章
    OpenCV学习笔记(27)KAZE 算法原理与源码分析(一)非线性扩散滤波
    查看>>
    OpenCV学堂 | OpenCV案例 | 基于轮廓分析对象提取
    查看>>
    OpenCV官方文档 理解k - means聚类
    查看>>
    OpenCV探索
    查看>>
    OpenCV环境搭建(一)
    查看>>
    openCV目标识别 目标跟踪 YOLO5深度学习 Python 计算机视觉 计算机毕业设计 源码下载
    查看>>
    opencv笔记(1):图像缩放
    查看>>
    opencv笔记(二十四)——得到轮廓之后找到凸包convex hull
    查看>>
    OpenCV计算点到直线的距离 数学法
    查看>>
    Opencv识别图中人脸
    查看>>
    OpenCV读写avi、mpeg文件
    查看>>
    opencv面向对象设计初探
    查看>>
    OpenCV(1)读写图像
    查看>>
    OpenCV:不规则形状区域中每种颜色的像素数?
    查看>>
    OpenCV:概念、历史、应用场景示例、核心模块、安装配置
    查看>>
    OpenDaylight融合OpenStack架构分析
    查看>>
    openEuler Summit 2022 成功举行,开启全场景创新新时代
    查看>>
    openEuler 正式开放:推动计算多样化时代的到来
    查看>>
    OpenEuler23.03欧拉系统_安装瀚高数据库企业版6.0.4_踩坑_安装以后系统无法联网_启动ens33网卡---国产瀚高数据库工作笔记002
    查看>>
    OpenFeign源码学习
    查看>>