• Netty内存池的整体架构


    一、为什么要实现内存管理?

    • Netty 作为底层网络通信框架,网络IO读写必定是非常频繁的操作,考虑到更高效的网络传输性能,堆外内存DirectByteBuffer必然是最合适的选择。堆外内存在 JVM 之外,在有效降低 JVM GC 压力的同时,还能提高传输性能。
    • 堆外内存是非常宝贵的资源,申请和释放都是高成本的操作,使用不当还可能造成严重的内存泄露等问题 。那么进行池化管理,如使用Netty提供的PooledUnsafeDirectByteBuf,多次重用是比较有效的方式。从申请内存大小的角度讲,申请多大的DirectByteBuffer进行池化又会是一大问题,太大会浪费内存,太小又会出现频繁的扩容和内存复制!所以呢,就需要有一个合适的内存管理算法,尽量避免多个Nio线程之间的竞争、解决高效分配内存,和内存碎片化的问题。所以一个优秀的内存管理算法必不可少。
    • 就内存管理而言,GC带给我们的价值不言而喻,减轻了内存管理带给程序员的困扰,为函数式编程(大量的临时对象)、脚本语言编程带来了春天。但是对于QPS非常高,比如1M级,在每次处理中即便是产生1K的垃圾,都会导致频繁的GC。在这种模式下,手动回收内存的机制,效率更高。

    二、内存管理中各组件关系

    Netty内存管理中各组件关系如下图,首先PooledByteBufAllocator通过PoolThreadCache获取PoolArena,然后PoolArena选取一个PoolChunkList分配PoolChunk,PoolChunk中分配内存Page,Page中分配PoolSubpage,最后初始化PooledUnsafeDirectByteBuf。若PooledUnsafeDirectByteBuf被释放,将会添加到PoolThreadCache重复利用。

    三、内存池数据结构总览

    四、内存申请流程

  • 相关阅读:
    【小沐学NLP】Python使用NLTK库的入门教程
    【C++】基础入门(一):域、命名空间、C++输入&输出
    可视化视频监控云平台EasyCVR使用RTMP_PUSH推流不成功是什么原因?
    【狂神说Java】redis
    发布订阅者模式
    php 使用 python translate 实现离线翻译
    对称二叉树(Leetcode &101)
    K8s部署calico拉取不到镜像
    Numpy介绍
    Yarn 和 npm 的区别
  • 原文地址:https://www.cnblogs.com/huanongying/p/16702533.html