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进行物理内存分配,不在JVM的堆内存中,需要手动释放。
Netty内存池化过程
Netty 采用了 jemalloc 的思想,依赖多个 Arena(分配器)来分配内存,运行中的应用都有固定数量的多个 Arena,默认