码迷,mamicode.com
首页 > Web开发 > 详细

Netty源码解析(4)-内存分配

时间:2020-04-12 22:46:12      阅读:93      评论:0      收藏:0      [点我收藏+]

标签:创建   大于   地方   led   bsp   write   mic   内存分配器   dex   

ByteBuf直接与底层IO打交道

1、内存类别有哪些

2、如何减少多线程内存分配竞争

3、不同大小内存是如何分配的

内存与内存管理器的抽象

不同规格大小和不同内存类别的分配策略

内存回收

ByteBuf结构

  readerIndex,表示要读数据从当前指针开始读,从0到readerIndex这段空间表示是无效的

  writerIndex,必须大于readerIndex,表示要写数据从当前指针开始写,从readerIndex到writerIndex这段空间表示可以读的

  capacity,必须,从writerIndex到capacity这段空间表示空闲可以写的

ByteBuf API

  read,从readerIndex往后开始读

  write 从writerIndex往后开始写

  set 不移动任何指针,直接再当前指针地方进行设置

  markReaderIndex 将readerIndex进行保存起来

  resetReaderIndex 将readerIndex进行恢复,这样读数据就不会移动指针

  markWriterIndex 同上

  resetWriterIndex  同上

  readableBytes() writerIndex - readerIndex

  writeableBytes() capacity - writerIndex

ByteBuf分类

  技术图片

 

   Pooled和UnPooled,内存分配时从已经分配的一块内存中分配一块,有预分配过程,UnPooled就是直接向操作系统申请内存

  Unsafe和非UnSafe,Unsafe可以直接拿到内存地址,可以直接拿到ByteBuf在JVM内存通过内存地址和偏移量,非unsafe可以直接调用jdk api读写,通过数组和下标访问数据,。jdk自动判断Unsafe或者非Unsafe

  Heap和Direct,在堆上直接分配,jc自动回收管理,依赖一个数组,Direct调用jdk api分配不会被jvm内存回收管理,依赖jdk底层的ByteBuffer。

ByteBufAllocator 内存管理器

    AbstractByteBufAllocator骨架实现

      UnPooledByteBufAllocator,直接分配一个容量大小的数组

        newHeapBuffer 在堆上new一个数组出来传入并保存

        newDirectBuffer 依赖于jdk底层ByteBuffer,保存初始地址和容量。

      PooledByteBufAllocator,首先拿到线程局部缓存,PoolThreadCache先创建PoolArena<byte[]>,PoolArena<ByteBuf>这两种内存池,在线程上的Arena上进行内存分配。创建内存分配器时会创建两种类型的数组,PoolArena.HeapArena和PoolArena.directArena

        newHeapBuffer

        newDirectBuffer

技术图片

 

Netty源码解析(4)-内存分配

标签:创建   大于   地方   led   bsp   write   mic   内存分配器   dex   

原文地址:https://www.cnblogs.com/xiaofeiyang/p/12688010.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!