使用 Unpooled 创建 ByteBuf
Unpooled 是 netty 提供的一个工具类,通过它可以方便地创建各种类型的 ByteBuf。需要注意的是,通过 Unpooled 创建的是非池化的 ByteBuf,在注重性能的场景需要使用各种 PooledByteBuf。接下来我们就来看下 Unpooled 类是如何使用的。
Unpooled 提供了一系列的方法用于创建 ByteBuf,根据底层实现的不同,可以将这些 ByteBuf 分为四种类型,分别是 heapBuffer、directBuffer、wrappedBuffer 和 copiedBuffer
heapBuf
heapBuf 使用的是在 java 堆内存上分配的空间,底层是通过 byte 数组存储数据的,对应的实现类为 UnpooledHeapByteBuf 及其子类。在 UnpooledHeapByteBuf 类中定义了一个 byte [] 类型的数组
1 | byte[] array; |
根据创建 byte 数组的方式不同,netty 提供了 UnpooledUnsafeHeapByteBuf 和 UnpooledHeapByteBuf 两个实现类,其中 UnpooledUnsafeHeapByteBuf 是通过 jdk 提供的 jdk.internal.misc.Unsafe 类对数组进行操作的。
要创建一个 heapBuf,可以使用如下几种方式
1 | // initialCapacity默认大小256 |
directBuf
和 heapBuf 不同的是,directBuf 是在堆外内存分配的。在进行网络 I/O 时,需要将 heapBuf 转换为 directBuf。
Unpooled 同样为 directBuf 提供了 3 种创建方式
1 | // initialCapacity默认大小256 |
wrappedBuffer
wrappedBuffer 可以对已有的 byte 数组或 ByteBuf 进行封装,从而提供一个新的视图,用于对原数据进行操作。对原数据内容进行操作会影响创建的 wrappedBuffer,反之亦然。
1 | // 指定byte数组 |
copiedBuffer
copiedBuffer 是对原数据进行深拷贝生成的 ByteBuf。和 wrappedBuffer 不同的是,它与原数据是独立的,对原数据进行修改不会影响生成的 copiedBuffer,反之亦然。
1 | // 原数据是基础类型,方法名为copy* |
- 2021-06-30
最近花时间研究了下 Netty 的内存管理实现,感觉挺有意思的,但也明显地感觉到,这部分功能要比其他功能模块更难理解。在这个过程中,我一直在想,如果能有这么一张图,能够说明内存管理的模块组成、各个模块之间的关系以及其实现原理,那么我就可以以更短的时间读懂相关源码了。因此,我将自己的一些理解画成了图。如果你也对这块内容感兴趣,兴许这篇文章能有所帮助。
预览: