W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗值獎勵
本節(jié)介紹 ByteBuf 實例管理的幾種方式:
為了減少分配和釋放內(nèi)存的開銷,Netty 通過支持池類 ByteBufAllocator,可用于分配的任何 ByteBuf 我們已經(jīng)描述過的類型的實例。是否使用池是由應用程序決定的,表5.8列出了 ByteBufAllocator 提供的操作。
Table 5.8 ByteBufAllocator methods
名稱 | 描述 |
---|---|
buffer() buffer(int) buffer(int, int) | Return a ByteBuf with heap-based or direct data storage. |
heapBuffer() heapBuffer(int) heapBuffer(int, int) | Return a ByteBuf with heap-based storage. |
directBuffer() directBuffer(int) directBuffer(int, int) | Return a ByteBuf with direct storage. |
compositeBuffer() compositeBuffer(int) heapCompositeBuffer() heapCompositeBuffer(int) directCompositeBuffer()directCompositeBuffer(int) | Return a CompositeByteBuf that can be expanded by adding heapbased or direct buffers. |
ioBuffer() | Return a ByteBuf that will be used for I/O operations on a socket. |
通過一些方法接受整型參數(shù)允許用戶指定 ByteBuf 的初始和最大容量值。你可能還記得,ByteBuf 存儲可以擴大到其最大容量。
得到一個 ByteBufAllocator 的引用很簡單。你可以得到從 Channel (在理論上,每 Channel 可具有不同的 ByteBufAllocator ),或通過綁定到的 ChannelHandler 的 ChannelHandlerContext 得到它,用它實現(xiàn)了你數(shù)據(jù)處理邏輯。
下面的列表說明獲得 ByteBufAllocator 的兩種方式。
Listing 5.15 Obtain ByteBufAllocator reference
Channel channel = ...;
ByteBufAllocator allocator = channel.alloc(); //1
....
ChannelHandlerContext ctx = ...;
ByteBufAllocator allocator2 = ctx.alloc(); //2
...
1.從 channel 獲得 ByteBufAllocator
2.從 ChannelHandlerContext 獲得 ByteBufAllocator
Netty 提供了兩種 ByteBufAllocator 的實現(xiàn),一種是 PooledByteBufAllocator,用ByteBuf 實例池改進性能以及內(nèi)存使用降到最低,此實現(xiàn)使用一個“jemalloc”內(nèi)存分配。其他的實現(xiàn)不池化 ByteBuf 情況下,每次返回一個新的實例。
Netty 默認使用 PooledByteBufAllocator,我們可以通過 ChannelConfig 或通過引導設(shè)置一個不同的實現(xiàn)來改變。更多細節(jié)在后面講述 ,見 Chapter 9, "Bootstrapping Netty Applications"
當未引用 ByteBufAllocator 時,上面的方法無法訪問到 ByteBuf。對于這個用例 Netty 提供一個實用工具類稱為 Unpooled,,它提供了靜態(tài)輔助方法來創(chuàng)建非池化的 ByteBuf 實例。表5.9列出了最重要的方法
Table 5.9 Unpooled helper class
名稱 | 描述 |
---|---|
buffer() buffer(int) buffer(int, int) | Returns an unpooled ByteBuf with heap-based storage |
directBuffer() directBuffer(int) directBuffer(int, int) | Returns an unpooled ByteBuf with direct storage |
wrappedBuffer() | Returns a ByteBuf, which wraps the given data. |
copiedBuffer() | Returns a ByteBuf, which copies the given data |
在 非聯(lián)網(wǎng)項目,該 Unpooled 類也使得它更容易使用的 ByteBuf API,獲得一個高性能的可擴展緩沖 API,而不需要 Netty 的其他部分的。
ByteBufUtil 靜態(tài)輔助方法來操作 ByteBuf,因為這個 API 是通用的,與使用池無關(guān),這些方法已經(jīng)在外面的分配類實現(xiàn)。
也許最有價值的是 hexDump() 方法,這個方法返回指定 ByteBuf 中可讀字節(jié)的十六進制字符串,可以用于調(diào)試程序時打印 ByteBuf 的內(nèi)容。一個典型的用途是記錄一個 ByteBuf 的內(nèi)容進行調(diào)試。十六進制字符串相比字節(jié)而言對用戶更友好。 而且十六進制版本可以很容易地轉(zhuǎn)換回實際字節(jié)表示。
另一個有用方法是 使用 boolean equals(ByteBuf, ByteBuf),用來比較 ByteBuf 實例是否相等。在 實現(xiàn)自己 ByteBuf 的子類時經(jīng)常用到。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: