- 浏览: 32474 次
- 性别:
- 来自: 重庆
最新评论
-
chenzh1314:
太厉害了,虽然看不懂,但还是感觉很厉害!!
dubbo源码分析-consumer端1-consumer代理生成
文章列表
如果你看了前面的几篇内存池的介绍,你可能会觉得并没有什么卵用。 这里就搞点有用的 -- netty内存池可调优参数
参数名
说明
默认值
io.netty.allocator.pageSize
page的大小
8192
io.netty.allocator.maxOrder
一个chunk的大小=pageSize << maxOrder
11
io.netty.allocator.numHeapArenas
heap arena的个数
min(cpu核数,maxMemory/chunkSize/6),一般来说会=cpu核数
io.ne ...
看了前面的PoolArena分析,我们知道PoolArena在分配内存时,使用了synchronized来保证线程安全,这样就带来了一定的效率问题。如何能再此基础上再优化呢,答案很简单,使用ThreadLocal类似的解决方案避免加锁! 为什么可以使用ThreadLocal,如果了解过netty线程模型(有兴趣后续可以一起学习),应该知道netty的woker线程池,它负责了数据的接收、发送(编解码这里先不说),并且保证同一个连接在同一个线程中完成这两个步骤,因此很容易利用ThreadLocal进行内存的分配和回收优化。
下面我们来看看内存池内存分配流程:
1、ByteBufAllocat ...
前面我们讲到了内存池中的几个重要的类:
1、PoolChunk:维护一段连续内存,并负责内存块分配与回收,其中比较重要的两个概念:page:可分配的最小内存块单位;chunk:page的集合;
2、PoolSubpage:将page分为更小的块进行维护;
3、PoolChunkList:维护多个PoolChunk的生命周期。
多个PoolChunkList也会形成一个list,方便内存的管理。最终由PoolArena对这一系列类进行管理,PoolArena本身是一个抽象类,其子类为HeapArena和DirectArena,对应堆内存(heap buffer)和堆外内存(direct ...
前面我们介绍了PoolChunk以及针对page的更细粒度的PoolSubpage,其实在chunk的上层还有一个管理类:PoolChunkList,PoolChunkList负责管理多个chunk的生命周期,在此基础上对内存分配进行进一步的优化,那它是如何去做的呢?我们来简单的了解下,先看看它的几个属性:
PoolArena<T> arena; // 这个东西又出现了,看来是个终极boss啊,后面再提
// 没有list还有自己的next和prev节点,最终组成一个list的link list
PoolChunkList<T> nextList;
Poo ...
前面我们讲过了负责内存分配的类PoolChunk,它最小的分配单位为page, 而默认的page size为8K。在实际的应用中,会存在很多小块内存的分配,如果小块内存也占用一个page明显很浪费,针对这种情况,可以将8K的page拆成更小的块,这已经超出chunk的管理范围了,这个时候就出现了PoolSubpage, 其实PoolSubpage做的事情和PoolChunk做的事情类似,只是PoolSubpage管理的是更小的一段内存。
如上图,PoolSubpage将chunk中的一个page再次划分,分成相同大小的N份,这里暂且叫Element,通过对每一个Element的标记与清理 ...
从netty 4开始,netty加入了内存池管理,采用内存池管理比普通的new ByteBuf性能提高了数(2)十倍。相信有些朋友会和我一样,对他的实现方式很感兴趣。这里把学习netty内存池的过程记录下来,与大家一起分享。
首先给大家介绍的 ...
netty中用到内存泄露检测的地方主要有:1、CompositeByteBuf;2、HashedWheelTimer;3、继承AbstractByteBufAllocator的几个类。
下面我们看看netty里的内存检测类ResourceLeakDetector的具体实现:
netty的内存泄露检测分为四级:
DISABLED: 不进行内存泄露的检测;
SIMPLE: 抽样检测,且只对部分方法调用进行记录,消耗较小,有泄漏时可能会延迟报告,默认级别;
ADVANCED: 抽样检测,记录对象最近几次的调用记录,有泄漏时可能会延迟报告;
PARANOID:每次创建一个对象时都进行 ...