代碼是:
ByteBuf buf = (ByteBuf)msg;
byte[] req = new byte[buf.readableBytes()];
buf.readBytes(req);
String body = new String(req,"UTF-8");
Netty之ByteBuf:
ByteBuf是壹個byte存放的緩沖區。
ByteBuf通過兩個位置的指針來協助緩沖區的讀寫操作,讀操作使用readIndex,寫操作使用writeIndex。
ByteBuf根據其數據存儲空間不同有可以分為三種:基於JVM堆內的,基於直接內存的和組合的。
堆內受JVM垃圾收集器的管轄,使用上相對安全壹些,不用每次手動釋放。弊端是GC是會影響性能的;還有就是內存的拷貝帶來的性能損耗(JVM進程到Socket)。
直接內存則不受JVM的管轄,省去了向JVM拷貝數據的麻煩。但是壞處就是別忘了釋放內存,否則就會發生內存泄露。相比於堆內存,直接內存的的分配速度也比較慢。
最佳實踐:在IO通信的線程中的讀寫Buffer使用DirectBuffer(省去內存拷貝的成本),在後端業務消息的處理使用HeapBuffer(不用擔心內存泄露)。
通過hasArray檢查壹個ByteBuf heap based還是direct buffer。
ByteBuf提供了兩個工具類來創建ByteBuf,分別是支持池化的Pooled和普通的Unpooled。Pooled緩存了ByteBuf的實例,提高性能並且減少內存碎片。它使用Jemalloc來高效的分配內存。
如果在Channel中我們可以通過channel.alloc()來拿到ByteBufAllocator,具體它使用Pool還是Unpool,Directed還是Heap取決於程序的配置。