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

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

Netty内存管理与分配机制

Netty作为一个高性能的网络框架,其内存管理机制以高效的缓存和内存分配为核心。以下将从内存规格、缓存结构、分配流程以及相关概念入手,深入探讨Netty的内存管理体系。

一、内存规格

Netty的内存规格主要包括以下几种类型:

  • tiny(0-512字节):适用于需求较小的内存分配,如16B、32B、48B等。
  • small(512字节-8KB):适用于中等规模的内存分配,如512B、1K、2K、4K等。
  • normal(8KB-16MB):适用于较大规模的内存分配,如8K、16K、32K等。
  • huge(大于16MB):不在缓存范围内,直接分配大块内存。
  • Netty的内存申请单位是Chunk,每个Chunk大小为16MB,用于向操作系统申请内存。Chunk可以划分为2048个Page(每个Page大小为8KB),进一步划分为多个SubPage(大小范围为0-8KB)。

    二、缓存数据结构

    Netty的缓存数据结构以MemoryRegionCache为核心,主要包括以下组成部分:

  • queue:用于存储和管理内存区域,通过队列来实现缓存的分配和回收。
  • sizeClass:定义内存规格,包括tiny、small、normal三种类型。
  • size:表示缓存区域的固定大小,同一MemoryRegionCache缓存的内存大小一致。
  • MemoryRegionCache的类型包括:

    • tinySubPageHeapCaches:用于16B、32B、48B、...、480B、496B的内存分配。
    • smallSubPageHeapCaches:用于512B、1K、2K、4K的内存分配。
    • normalHeapCaches:用于8K、16K、32K的内存分配。
    • tinySubPageDirectCachessmallSubPageDirectCachesnormalDirectCaches:用于直接分配内存的缓存。

    三、内存分配流程

    内存分配的入口是PooledByteBufAllocatornewHeapBuffer()newDirectBuffer()方法。具体流程如下:

  • 分段规格化:通过normalizeCapacity()方法将需求内存大小转换为符合内存规格的大小。
  • 缓存分配
    • tiny缓存:调用cacheForTiny()找到对应的MemoryRegionCache,尝试从tinySubPageHeapCachestinySubPageDirectCaches中分配内存。
    • small缓存:调用cacheForSmall()找到对应的MemoryRegionCache,尝试从smallSubPageHeapCachessmallSubPageDirectCaches中分配内存。
    • normal缓存:调用cacheForNormal()找到对应的MemoryRegionCache,尝试从normalHeapCachesnormalDirectCaches中分配内存。
  • 内存初始化:分配成功后,通过initBuf()方法将内存初始化为PooledByteBuf对象。
  • 对象池复用:将分配完成的内存放入对象池中,等待下次复用。
  • 四、内存分配重要概念

  • PoolArena:用于管理和分配内存的区域,包含多个PoolChunk。
  • PoolChunk:内存分配的基本单位,大小为16MB,包含多个Page。
  • Page与SubPage:Page为8KB,SubPage为0-8KB,用于细化内存分配,提高利用率。
  • MemoryRegionCache:缓存层,用于快速分配和释放内存,减少对操作系统的dependence。
  • 五、总结

    Netty通过复杂的缓存和内存分配机制,实现了高效的内存管理。内存规格的划分、缓存结构的优化以及灵活的内存分配流程,使Netty在高并发场景下表现出色。

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

    你可能感兴趣的文章
    NR,NF,FNR
    查看>>
    nrf开发笔记一开发软件
    查看>>
    NSDateFormatter的替代方法
    查看>>
    NSOperation基本操作
    查看>>
    NSSet集合 无序的 不能重复的
    查看>>
    NT AUTHORITY\NETWORK SERVICE 权限问题
    查看>>
    ntko文件存取错误_苹果推送 macOS 10.15.4:iCloud 云盘文件夹共享终于来了
    查看>>
    nullnullHuge Pages
    查看>>
    numpy 用法
    查看>>
    Numpy如何使用np.umprod重写range函数中i的python
    查看>>
    oauth2-shiro 添加 redis 实现版本
    查看>>
    OAuth2.0_JWT令牌-生成令牌和校验令牌_Spring Security OAuth2.0认证授权---springcloud工作笔记148
    查看>>
    OAuth2.0_JWT令牌介绍_Spring Security OAuth2.0认证授权---springcloud工作笔记147
    查看>>
    OAuth2.0_介绍_Spring Security OAuth2.0认证授权---springcloud工作笔记137
    查看>>
    OAuth2.0_完善环境配置_把资源微服务客户端信息_授权码存入到数据库_Spring Security OAuth2.0认证授权---springcloud工作笔记149
    查看>>
    OAuth2.0_授权服务配置_Spring Security OAuth2.0认证授权---springcloud工作笔记140
    查看>>
    OAuth2.0_授权服务配置_令牌服务和令牌端点配置_Spring Security OAuth2.0认证授权---springcloud工作笔记143
    查看>>
    OAuth2.0_授权服务配置_客户端详情配置_Spring Security OAuth2.0认证授权---springcloud工作笔记142
    查看>>
    OAuth2.0_授权服务配置_密码模式及其他模式_Spring Security OAuth2.0认证授权---springcloud工作笔记145
    查看>>
    OAuth2.0_授权服务配置_资源服务测试_Spring Security OAuth2.0认证授权---springcloud工作笔记146
    查看>>