我在Netty的兩種情況,其中我試圖儘量減少內存拷貝和優化內存使用:正確的方式,以儘量減少內存使用了Netty
(1)閱讀一個非常大的幀(20個Megabites)。 (2)讀取大量非常少的幀(20兆字節,每幀50個叮),重建爲管道中更高級別的一條消息。
對於第一種情況,當我在幀的開始處獲得長度時,我擴展了FrameDecoder。不幸的是,由於我沒有看到如何將長度返回給Netty(我只是指出幀是否完整),我相信Netty正在經歷多個填充緩衝區,複製和重新分配循環,因此使用的內存超過了所需的內存。有什麼我在這裏失蹤?或者我應該完全避免FrameDecoder,如果我期待這種情況?
在第二種情況下,我正在創建一個鏈接列表,我使用ChannelBuffers.wrappedBuffer(然後可以包裝在一個ChannelBufferInputStream中)包裝所有小框架,但我再次使用的內存比我預期的要多得多(可能是因爲分配的ChannelBuffers有空餘空間?)。這是使用Netty ChannelBuffers的正確方法嗎?
我很欣賞這個迴應,但你幾乎可以說明我已經在做什麼。 LengthFieldBasedFrameDecoder,因爲它延伸幀解碼器,繼承它的問題(你不能避免填充緩衝區/ realloc和複製週期)。我知道wrappedBuffer不會創建副本,但我仍然使用比預期更多的內存(堆增加3-4倍的消息大小)。 – Gareth
@Gareth沒有看到代碼,它很難說任何事情。我剛剛檢查了FrameDecoder,發現它使用DynamicChannel緩衝區女巫從256字節開始,所以我不確定它在接收時如何增長20MBs,我認爲,最好是用固定緩衝區編寫自己的FrameDecoder版本。 –