ByteBuf也支持直接内存和堆内存
ByteBuf buffer = ByteBufAllocator.DEFAULT.heapBuffer(10); //堆内存
堆内存,分配内存效率高,读写效率低。
ByteBuf buffer = ByteBufAllocator.DEFAULT.directBuffer(10); //直接内存
ByteBuf buffer = ByteBufAllocator.DEFAULT.buffer(10); //默认获取的是直接内存
直接内存创建和销毁的代价昂贵,但读写性能高,少一次内存复制,适合配合池化功能一起用。
直接内存对GC压力小,因为这部分内存不收JVM垃圾回收的管理,但也要注意及时主动释放。
池化管理
对创建资源比较慢的情况可以用池化思想来进行优化。
池化就相当于线程池、连接池的思想。
池化的最大意义在于重用ByteBuf,优点有:
1.没有池化,每次都要创建新的ByteBuf实例,这个操作对直接内存代价昂贵,就算是堆内存,也会增加GC的压力。
2.有了池化,则可以重用池中ByteBuf实例,并且采用与jemalloc类似的内存分配算法提升分配效率。
3.高并发时,池化功能更节约内存,减少内存溢出的可能。
池化功能开启,通过系统环境变量来设置:
-Dio.netty.allocator.type={unpooled|pooled}