Netty内存分配
在堆外内存使用方面,Netty 自己实现了一套创建、回收堆外内存池的相关功能。因为如果是在堆上分配内存空间将会触发频繁的 GC。今天我们就来围绕Netty堆外池化内存的分配流程,总结一下Netty是怎么向操作系统申请内存的,以及Netty申请到内存之后又是怎么管理的?
Netty内存分配对象
ByteBuf是Netty整个结构里面最为底层的模块,主要负责把数据从底层I/O读到ByteBuf,然后传递给应用程序,应用程序处理完成之后再把数据封装成ByteBuf写回I/O。
在Netty中,ByteBuf的大部分功能是在AbstractByteBuf
中实现的。
AbstractByteBuf
有众多子类,大致可以从三个维度来进行分类,分别如下。
Pooled
:池化内存,就是从预先分配好的内存空间中提取一段连续内存封装成一个ByteBuf,分给应用程序使用。Unsafe
:是JDK底层的一个负责I/O操作的对象,可以直接获得对象的内存地址,基于内存地址进行读写操作。Direct
:堆外内存,直接调用JDK的底层API进行