Netty内存管理--Chunk&Page

这篇具有很好参考价值的文章主要介绍了Netty内存管理--Chunk&Page。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

系列文章目录

1. Netty网络应用基础
2. Java I/O
3. IO/模型
4. 网络应用编解码
5. Netty Pipeline
6. Netty EventLoopGroup&EventLoop
7. Netty ThreadLocal&FastThreadLocal
8. Netty Future&Promise
9. Netty内存管理–(旧)PoolChunk&伙伴分配
10. Netty内存管理–内存池空间规格化SizeClasses
11. Netty内存管理–PoolChunk&PoolSubPage
12. Netty内存管理–内存池PoolArena
13. Netty内存管理–内存分配器PooledByteBufAllocator
14. Netty ObjectPool

写在前面

网络通信中,接收端通常需要多层解码,最终在应用层解码后才能得到业务层可处理的message。Netty需要缓存接收到的网络数据和待发送的网络数据,缓存发送/解码完成后就可以释放。其中对缓存的获取和释放频次高;通过系统调用获取内存本身比较耗时;高频的缓存释放对Java GC产生压力;随之带来的是GC压力。而GC过程中可能会导致STW(Stop The Wold)现象,进而影响响应延迟。因此需要对缓存的分配和释放做必要的管理。提高内存利用率。

从4.1.52.Final开始, Netty删除了TinyPagePool, 以减少内部碎片。官方提供的原因是由于jmelloc 4.x的更新, Netty随后也进行了必要的更新。参见Netty Release Note
本篇的page管理基于伙伴算法分配, 为4.1.52.Final之前版本使用,在此仅做简单探讨。

一、内存规格化

名称 尺寸 分配位置 分配单位
Normal [8K, 16M] Chunk Page
Tiny [496B, 4096B] Page SubPage
Small (0, 496B) Page SubPage
Huge 16M+ 不复用 不复用

最终形成两级颗粒度, 从Chunk中划分Page, 从Page中划分SubPage。本篇咱们先聚焦在Page级别的分配。

二、Chunk中Page管理

Chunk默认向OS申请16M的连续内存, 按照伙伴算法的划分方式, 直到每个伙伴的空间大小为一个page。整个划分过程结束后形成一颗满二叉树, 后续的空间管理基于该二叉树完成;

1.二叉树表示

Netty使用两个数组来memoryMap和depthMap表示该二叉树。memoryMap和depthMap, 下标都表示内存块编号,数值标识内存块层级。至于空间大小, 直接基于节点层级计算即可。

数值内容 含义
memoryMap[id] = depthMap[id] 该节点没有被分配, 初始化完成时为该状态。
depthMap[id] < memoryMap[id] < 最大高度(12) 至少有一个子节点被分配,但尚未完全被分配,不能再分配该高度对应的内存,只能根据实际情况在更低层次分配内存
memoryMap[id] = 最大高度(12) 该节点及其子节点已被完全分配,没有剩余空间

2 Page分配过程

假设现在有一个新初始化的chunk, 从中分配150K内存;

  1. 将150K的空间规格化, 结果为256K, 应该在第7层(每个单元的空间大小为256K);
  2. 遍历memoryMap, 遍历的索引分别为(1,2,4,8,16,32,64), 如下图黑框中内容为实际为遍历的节点(注意在Netty的MemoryMap和depthMap中有效索引从1开始,0是被浪费掉的);
  1. 结合前面的条件, memoryMap[64]这个节点可以正常分配, 将memoryMap[64]设置为12, 并关联更新父节点为左右节点中层级较小的depthMap。
memoryMap[index] 容量单位 原值 更新后的值
64 256K 7 12
32 512K 6 7
16 1M 5 6
8 2M 4 5
4 4M 3 4
2 8M 2 3
1 16M 1 2
  1. 虽然申请150K, 但最终实际获得了256K也就是32个Page的内存。到这里想必你已经对伙伴分配算法的分配过程有了一个初步的理解, 目标是要做到对不同颗粒度的连续内存分配。

3 Page回收过程

作为分配的逆过程, 回收过程就相对清晰了。比如前面150K内存回收, 将起始位置offset+32个page的内容清理掉, 然后memoryMap[64]=depthMap[64], 并关联设置父节点的值为左右子节点的memoryMap中较小的那个, 回收结束。

总结

本篇Netty中内存内存规格化,对应的管理颗粒Chuank和Page,以及Chunk中Page的分配与回收过程。Netty具体的实现中会做额外的一些优化,后续会一并总结。文章来源地址https://www.toymoban.com/news/detail-420483.html

到了这里,关于Netty内存管理--Chunk&Page的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • AIGC系列文章目录 第一章 AIGC 与AI对话,如何写好prompt?

    生成式人工智能AIGC(Artificial Intelligence Generated Content)是人工智能1.0时代进入2.0时代的重要标志。 AIGC对于人类社会、人工智能的意义是里程碑式的。 短期来看 AIGC改变了基础的生产力工具, 中期来看 会改变社会的生产关系, 长期来看 促使整个社会生产力发生质的突破,在

    2024年02月06日
    浏览(40)
  • 【ARM Cache 系列文章 2 -- Cache Coherence及内存顺序模学习】

    请阅读 【ARM Cache 系列文章专栏导读】

    2024年02月16日
    浏览(42)
  • AIGC系列文章目录 第三章 AIGC 简单易用免费的AI图像生成器: Stable Diffusion

    目前亲测体验的AI图像生成器有NovelAI、MJ和Stable Diffusion。其中, 支持免费、无限生成、超高专业级画质 的只有 Stable Diffusion 。 Stable Diffusion 由 Stable Diffusion XL 提供支持,是一款最先进的工具,可以将您的想象力变为现实。 只需点击几下和简单的文本输入,您就可以创建令人

    2024年02月03日
    浏览(54)
  • 【C++】动态内存管理(79分钟写的文章哪里看不懂了,快来学)

    动态内存管理目录: 一、C/C++内存分布  在学习了C/C++内存区域的划分后,我们来做几道题巩固一下: 1. 选择题:选项 : A.栈  B.堆  C.数据段(静态区)  D.代码段(常量区)globalVar在哪里?____  staticGlobalVar在哪里?____staticVar在哪里?____  localVar在哪里?____num1 在哪里?____char2在

    2024年02月07日
    浏览(31)
  • Linux系列 目录和文件管理

    作者简介:一名在校云计算网络运维学生、每天分享网络运维的学习经验、和学习笔记。   座右铭:低头赶路,敬事如仪 个人主页:网络豆的主页​​​​​​ 目录   前言 简介 本章重点 一.检查文本内容 ​编辑 1.cat命令——显示并连接(Concatenate)文件的内容 2.more和le

    2024年02月03日
    浏览(29)
  • DSO 系列文章(2)——DSO点帧管理策略

    DSO代码注释:https://github.com/Cc19245/DSO-CC_Comments PointFrameResidual 的状态有三种: IN ——内点。表示这个残差状态正常,可以参与优化; OOB —— Out Of Boundary ,出界点。表示把 host 帧上的点通过线性化点 或 最新状态的相机位姿投影到 target 帧之后,这个点不在图像范围内,表示

    2024年02月12日
    浏览(24)
  • C#程序变量统一管理例子 - 开源研究系列文章

             今天讲讲关于C#应用程序中使用到的变量的统一管理的代码例子。          我们知道,在C#里使用变量,除了private私有变量外,程序中使用到的公共变量就需要进行统一的存放和管理。这里笔者使用到的公共变量管理库划分为:1)窗体;2)路径;3)对象;所以笔

    2024年02月11日
    浏览(33)
  • 个人用C#编写的壁纸管理器 - 开源研究系列文章

    今天介绍一下笔者自己用C#开发的一个小工具软件:壁纸管理器。 开发这个小工具的初衷是因为Windows操作系统提供的功能个人不满意,而且现在闲着,所以就随意写了个代码。如果对读者有借鉴参考作用就更好了,能够直接代码段复用即可。这个壁纸管理器也比较简单,基于

    2024年02月13日
    浏览(29)
  • Rust系列(二) 内存管理

    上一篇:Rust系列(一) 所有权和生命周期 通过前面的文章,目前我已经了解到了 单一所有权、Move语义、Copy语义、可变和不可变借用以及引用计数 。突然回首可以发现, Move 语义和 Copy 语义保证了值的单一所有权;而可变和不可变借用又可以避免对象在作为函数参数进行传递

    2024年02月15日
    浏览(27)
  • DevOps系列文章 之 Java使用jgit管理git仓库

    最近设计基于gitops新的CICD方案,需要通过java读写git仓库,这里简单记录下。 在jgit中,存在最核心的三个组件:Git类,Repository类。Git类中包含了push commit之类的常见git操作,而Repository则实现了仓库的初始化和基本的管理功能。 Git类的实例都会持有一个Repository实例。 Repositor

    2024年02月12日
    浏览(28)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包