netty内存池

1:PooledByteBufAllocator    内存池入口,应用通过该类从内存池中申请内存

PoolThreadCache:线程缓存池

Recycler:上文的Recycler是个对象池,储存的是相应类型的堆中对象的集合。

2:PooledByteBufAllocator获取bytebuf步骤:

      1)如果是pool类型,先在线程对象池中获取一个相应类型的poolBuffer对象,这个对象是在堆中的,也是返回的对象,然后会使用PoolThreadCache这个线程内存池,获取一块合适大小的内存。接下来根据这块内存的信息对这个poolBuffer对象进行init,比如设置内存的address,length等,用户就可以通过这个buffer对象对相应的内存进行操作。

      2)注意区别线程对象池和线程内存池。线程对象池指同一类型的对象集合,用户也只能通过对象来进行操作,比如读写数据。而线程内存池是许多内存块的集合,用户通过对象读写数据还是要定位到实际的内存地址(虚拟内存地址)。内存池就通过把对象和一块内存绑定,对象的读写操作都会反应到这块内存上。

3)内存是有限的,为了最大化内存的利用率以及提高内存分配回收的效率,netty实现了类似jemalloc内存分配的方式给对象分配内存。

4)获取一个buffer对象-->给buffer对象属性赋值(赋的值就是内存的地址、大小)

5)  比如现在需要分配一个UnpooledHeapByteBuf类型的ByteBuf对象,其初始大小为20,最大容量为100,因为是unpooled,意味着这各类型的ByteBuf是没有对象池的,需要的时候直接new一个即可

                          (1)new            UnpooledHeapByteBuf(this,initialCapacity,maxCapacity);

单纯的一个没有经过初始化(成员变量没有赋值)的ByteBuf是不能进行读写的,因为其读写方法都需要确切的读写内存地址的。对于UnpooledHeapByteBuf类型的ByteBuf,其是一个HeapByteBuf,Heap意味着这个ByteBuf的读写操作是在JVM堆上进行的,其读写内存地址需要在jvm对上进行分配,所以在初始化时要根据需要的大小创建一个Byte类型的数组Byte[]对UnpooledDirectByteBuf进行初始化,接下来对这个Buf的读写都会反应在这个字节数组中。

6)对于UnpooledDirectByteBuf类型的ByteBuf,Direct意味着这个ByteBuf的读写实现方法是以直接内存为基础进行实现的,其读写区域是在直接内存上,在初始化时构造一个DirectByteBuffer对象(nio中的ByteBuffer)赋值给UnpooledDirectByteBuf的buf属性,接下来对这个UnpooledDirectByteBuf类型对象的读写都会反应到这个ByteBuffer上。

7)对于pool类型的,

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 首先介绍些netty内存池的层级结构,主要分为Arena、ChunkList、Chunk、Page、Subpage...
    沧行阅读 7,740评论 4 10
  • 从三月份找实习到现在,面了一些公司,挂了不少,但最终还是拿到小米、百度、阿里、京东、新浪、CVTE、乐视家的研发岗...
    时芥蓝阅读 42,372评论 11 349
  • 前奏 https://tech.meituan.com/2016/11/04/nio.html 综述 netty通...
    jiangmo阅读 5,910评论 0 13
  • 一、温故而知新 1. 内存不够怎么办 内存简单分配策略的问题地址空间不隔离内存使用效率低程序运行的地址不确定 关于...
    SeanCST阅读 7,883评论 0 27
  • 2017.8.9 阴这几天终于下起了雨昨晚是倾盆大雨而今晨绵绵细雨终于可以在暑假给高温放几天假现在坐在去往无锡...
    摇摇小朋友阅读 189评论 0 0