netty内存知识整理
1.ByteBuf
api: read ,write,set,mark,reset
byteBuf分类图:
1.pooled和u'npooled
pooled:从预先分配好的内存中分配,unpooled:每次申请新内存 就是池化和非池化的区别
2.unsafe和非unsafe
unsafe:可以直接拿到jvm的内存,依赖jdk的unsafe ( JDK的rt.jar包中的Unsafe类提供了硬件级别的原子性操作,Unsafe类中的方法都是native方法 )其实就是在jdk的bytebuff包装了一下
unsafe是通过内存地址和下标去拿数据,非unsafe是通过数组和下标去拿数据
3.heap和direct
heap:从堆上内存分配就是数组byte[] array unpool从array拿, pool从池中拿
directbuffer:堆外内存,不参与gc过程
4.ByteBufAllocator内存分配器
5. Recycler
https://blog.****.net/alex_xfboy/article/details/90384332
6.byteBuf释放
1.连续的内存区段加入缓存(取得时候也是从缓存先取)
2.如果缓存满了 ->标记连续的内存区段未使用
3.ByteBuf加入对象池Recycler
问题:
1.怎么解决多线程得内存分配:fastThreadlocal ; 每个线程分配一个arean进行内存分配,线程进行隔离
2.不同大小的内存是如何进行分配得:使用对象池,缓存,二叉树分配,位图的技术来优化