Netty学习(三)高性能之ByteBuf(篇幅较长)
Netty 高性能之ByteBuf Netty 高性能的原因除了前面提到的 NIO 的 Reactor 线程模型, 零拷贝也是其高性能的一个重要原因. 零拷贝 省去了数据从用户进程到内核的拷贝(jvm 堆内的数据 os 是不能直接使用的, 要让os可以使用的话, 需要将堆内的数据拷贝一份到堆外) CompositeByteBuf 复合多个 ByteBuf, netty使用的是逻辑上的关联, 对外提供访问的统一接口, 而不是重新申请内存再将数据写入新的 ByteBuf Netty 的 ByteBuf 类型 Pooled(池化)、Unpooled(非池化) Direct(直接缓冲区/堆外)、Heap(jvm堆内) unsafe(unsafe 调用的本地方法)、safe(一般也不会这么说, 这是相对于 unsafe, 指的jvm 堆内的操作) Netty 默认都会优先使用 unsafe 的实现, 池化/非池化(Pooled/Unpooled): Netty 先申请一块连续的空间作为 ByteBuf 池, 需要用到的时候直接去池里面取, 用完之后返还给 ByteBuf 池, 而不需要每次要用 ByteBuf 的时候都去申请. 堆外对象的创建比堆内的耗时. 总结: 池化的作用就是加快程序获取到操作的对象 堆外/堆内(direct/heap): 堆内指的在 JVM 中的数据,申请