netty内存算法小析(下)
Posted 24HoursFor
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了netty内存算法小析(下)相关的知识,希望对你有一定的参考价值。
上一篇分析完netty的PoolChunk,PoolSubpage的底层设计。继续往上层建筑分析。先上一图,分层的调用大概就是这样。这个时候就引入了新的两个类PoolArena,PoolChunkList。那我们有活干了!
先看PoolArena,作为内存申请和释放的入口,负责同步控制等等的职责。以下是他的分配的代码,那么主要是根据上一节的容量的不同进行分配内存空间,且该类是个抽象类,主要是上层调用是堆外和堆内之分。
从上面的代码大致可以看出,1,tiny,small,normal首先会从内存的中内配,也就是PoolThreadCache该类的做的事情。2,没有从缓存中得到分配的Tiny/Small请求,会从以第一次请求大小为基准进行分组的Subpage双向链表中进行分配,也就是第一次分配的基准是512B,那么在缓存get不到都要以这个基数进行分配,那么很容易就形成了大致的结构。
那么还有一段代码好奇的是为啥要吧PoolChunkList这个类,而且还是根据的内存的利用率进行划分的。比如50%,25%等等的比例
那么为啥要这么设计呢?且看PoolChunkList的代码,他会对List增加一个Chunk,如果发现的已经超过了该Chunk就会增加到PoolChunkList的下一个链表上去
再回到上一篇的我们写代码的如何分配内存的,可以看PooledByteBufAllocator里面的一段的代码
可以看出是通过ThreadLocal中拿到对应的PoolArena,多个线程可能公用一个PoolArena,需要考虑同步的问题,netty加锁非常值得学习,尽量的细小话。这样就算把整个内存的分配串起来,当然这个过程还有很多未曾说明白到的,比如netty的内存泄漏检测机制参考类ResourceLeakDetector
以上是关于netty内存算法小析(下)的主要内容,如果未能解决你的问题,请参考以下文章