`
youaremoon
  • 浏览: 32474 次
  • 性别: Icon_minigender_1
  • 来自: 重庆
社区版块
存档分类
最新评论
文章列表
如果你看了前面的几篇内存池的介绍,你可能会觉得并没有什么卵用。 这里就搞点有用的 -- 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:每次创建一个对象时都进行 ...
Global site tag (gtag.js) - Google Analytics