前言
本文通过分析抽象内存分配器API梳理其基于堆内存、堆外内存分配的实现原理。最后走查了CompositeByteBuf这种类似数据库视图的实现原理。
一、内存分配器概览堆外内存堆内存
分配方式优点缺点堆内存JVM负责内存的分配与回收数据过多会引起频繁GC和停顿;多一次拷贝,在用户态分配、I/O通信需要数据拷贝到内核态堆外内存I/O性能高,直接在内核态分配降低GC频率和停顿内存分配和收回比较慢、需要手动处理内存分配器类图
字节缓存的分配出自ByteBufAllocator,其实现类AbstractByteBufAllocator(抽象类)、PooledByteBufAllocator(池化内存分配器)、UnpooledByteBufAllocator(非池化内存分配器)、PreferHeapByteBufAllocator(堆内存分配器)、PreferredDirectByteBufAllocator(堆外内存分配器)。
主要接口
接口说明ByteBufbuffer()分配一块字节缓存,由其实现类决定堆外内存或者堆内存ByteBufioBuffer()系统支持UNSAFE和CLEANER则优先分配堆外内存;否则分配堆内存。ByteBufheapBuffer()分配堆内存字节缓存区ByteBufdirectBuffer()分配堆外内存字节缓存区CompositeByteBuf