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

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

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

时间: 2024-07-31 04:53:09

Netty源码解析(4)-内存分配的相关文章

Netty源码—五、内存分配概述

Netty中的内存管理应该是借鉴了FreeBSD内存管理的思想--jemalloc.Netty内存分配过程中总体遵循以下规则: 优先从缓存中分配 如果缓存中没有的话,从内存池看看有没有剩余可用的 如果已申请的没有的话,再真正申请内存 分段管理,每个内存大小范围使用不同的分配策略 我们先总体上看下Netty内存分配的策略,然后再结合对应的数据结构来看看每种策略的具体实现. 总体分配策略 netty根据需要分配内存的大小使用不同的分配策略,主要分为以下几种情况(pageSize默认是8K, chun

redis源码解析之内存管理

zmalloc.h的内容如下: 1 void *zmalloc(size_t size); 2 void *zcalloc(size_t size); 3 void *zrealloc(void *ptr, size_t size); 4 void zfree(void *ptr); 5 char *zstrdup(const char *s); 6 size_t zmalloc_used_memory(void); 7 void zmalloc_enable_thread_safeness(v

netty源码解析

最近在看netty的源码,本来想写一些东西的,但是无意间看到了一个牛人写的一些有关netty的博客,感觉写得太好了,故对他的博客中有关netty的部分整理了一下放入了我的印象笔记中,现在把链接公开出来,希望对想学习netty的同学有所帮助: https://app.yinxiang.com/pub/topxiall/netty netty源码解析

netty源码解析(4.0)-29 Future模式的实现

Future模式是一个重要的异步并发模式,在JDK有实现.但JDK实现的Future模式功能比较简单,使用起来比较复杂.Netty在JDK Future基础上,加强了Future的能力,具体体现在: 更加简单的结果返回方式.在JDK中,需要用户自己实现Future对象的执行及返回结果.而在Netty中可以使用Promise简单地调用方法返回结果. 更加灵活的结果处理方式.JDK中只提供了主动得到结果的get方法,要么阻塞,要么轮询.Netty除了支持主动get方法外,还可以使用Listener被

Samba 源码解析之内存管理

由于工作需要想研究下Samba的源码,下载后发现目录结构还是很清晰的.一般大家可能会对source3和source4文件夹比较疑惑.这两个文件夹针对的是Samba主版本号,所以你可以暂时先看一个.这里我选择Source3. 阅读源码最好要动手编译并安装,但这里我偷个懒直接在ubuntu上安装跳过了编译步骤.首先从client开始看起.SMBclient的所有命令的对应code都在source3/client/client.c中,我们由浅入深,挑一个比较简单的命令来看下它的执行流程,将简单的命令分

nginx源码解析之内存池

nginx自身实现了内存池,所有内存分配都是基于内存池来操作.基本思想是预申请一段内存空间,低于指定大小的内存(小段内存)直接从内存池中申请,超过指定大小的内存(大段内存)直接调用malloc申请.相关代码在os/unix/ngx_alloc.{c,h}和core/ngx_palloc.{c,h}. os/unix/ngx_alloc.{c,h}文件封装了内存分配的系统调用,其中: ngx_alloc调用malloc申请一段内存空间 ngx_calloc调用malloc申请一段内存空间,再调用m

Netty源码—七、内存释放

Netty本身在内存分配上支持堆内存和直接内存,我们一般选用直接内存,这也是默认的配置.所以要理解Netty内存的释放我们得先看下直接内存的释放. Java直接内存释放 我们先来看下直接内存是怎么使用的 ByteBuffer.allocateDirect(capacity) 申请的过程是其实就是创建一个DirectByteBuffer对象的过程,DirectByteBuffer对象只相当于一个holder,包含一个address,这个是直接内存的指针. 调用native方法申请内存 初始化cle

java高并发技术netty源码解析视频教程

一 课程概要二 并发编程框架核心三 并发编程框架高级特性四 并发编程深入学习与面试精讲五 并发编程框架底层源码深度分析六 Netty整合并发编程框架Disruptor实战百万长链接服务构建七 分布式统一ID生成服务架构设计八 回顾总结源码.zip 原文地址:https://www.cnblogs.com/yellowvase/p/10713834.html

netty源码解析(4.0)-26 ByteBuf内存池:PoolArena-PoolSubpage

PoolChunk用来分配大于或等于一个page的内存,如果需要小于一个page的内存,需要先从PoolChunk中分配一个page,然后再把一个page切割成多个子页-subpage,最后把内存以subpage为单位分配出去.PoolSubpage就是用来管理subpage的. 一个page会被分割成若干个大小相同的subpage,subpage的的大小是elemSize.elemSize必须是16的整数倍,即必须满足elemSize & 15 == 0.elemSize的取值范围是(16,