netty内存算法小析(下)

Posted 24HoursFor

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了netty内存算法小析(下)相关的知识,希望对你有一定的参考价值。

       上一篇分析完netty的PoolChunk,PoolSubpage的底层设计。继续往上层建筑分析。先上一图,分层的调用大概就是这样。这个时候就引入了新的两个类PoolArena,PoolChunkList。那我们有活干了!

     

        先看PoolArena,作为内存申请和释放的入口,负责同步控制等等的职责。以下是他的分配的代码,那么主要是根据上一节的容量的不同进行分配内存空间,且该类是个抽象类,主要是上层调用是堆外和堆内之分。

     

netty内存算法小析(下)

   

netty内存算法小析(下)

     从上面的代码大致可以看出,1,tiny,small,normal首先会从内存的中内配,也就是PoolThreadCache该类的做的事情。2,没有从缓存中得到分配的Tiny/Small请求,会从以第一次请求大小为基准进行分组的Subpage双向链表中进行分配,也就是第一次分配的基准是512B,那么在缓存get不到都要以这个基数进行分配,那么很容易就形成了大致的结构。

netty内存算法小析(下)

     那么还有一段代码好奇的是为啥要吧PoolChunkList这个类,而且还是根据的内存的利用率进行划分的。比如50%,25%等等的比例

netty内存算法小析(下)

    那么为啥要这么设计呢?且看PoolChunkList的代码,他会对List增加一个Chunk,如果发现的已经超过了该Chunk就会增加到PoolChunkList的下一个链表上去

       再回到上一篇的我们写代码的如何分配内存的,可以看PooledByteBufAllocator里面的一段的代码

    可以看出是通过ThreadLocal中拿到对应的PoolArena,多个线程可能公用一个PoolArena,需要考虑同步的问题,netty加锁非常值得学习,尽量的细小话。这样就算把整个内存的分配串起来,当然这个过程还有很多未曾说明白到的,比如netty的内存泄漏检测机制参考类ResourceLeakDetector  

以上是关于netty内存算法小析(下)的主要内容,如果未能解决你的问题,请参考以下文章

Netty内存池之PoolChunk

Netty源码_内存管理(jemalloc4)

Java中看内存分配—Netty内存池

支撑百万级并发,Netty如何实现高性能内存管理

Netty源码分析--内存模型(下)

高性能Netty之内存池源码分析