2016-07-28 13 views
1

ByteBufを作成してに送信するには、writeまたはwriteAndFlushメソッドを使用します。Netty 4.1:ioBuffer v.s. directBuffer v.s. heapBuffer

私が理解しているように、ダイレクトバッファはヒープバッファよりも優れています。これは、後者がJVMによって管理され、送信時にダイレクトバッファにコピーする必要があるためです。

ダイレクトバッファはJVMで管理されていないため、多くの直接バッファを割り当てると、OutOfMemoryError,が正しいことがありますか?

そして、私は別の方法ByteBufAllocator.ioBuffer() がある文書を通知は I/Oに適しているByteBuf、好ましくは、直接バッファを割り当てる

言います。

私はそれがこのように動作を推測:
ByteBufAllocatorは二つのプール、ダイレクトバッファのための1つのプール、ヒープバッファのための他を管理します。ダイレクトバッファーに十分なスペースがない場合、これはヒープバッファーから割り振ります。 私はそうですか?

ByteBufAllocatorはダイレクトバッファのプールサイズをどのように決定しますか?

答えて

0

ダイレクトバッファはJVMで管理されていないので、多くの直接バッファを割り当てるとOutOfMemoryErrorが正しくなる可能性がありますか?

リリースせずに何かを割り当てすぎると、OOMが発生します。 ByteBufAllocatorは二つのプール、ダイレクトバッファのための1つのプール、ヒープバッファのための他を管理します。私はそれがこのように動作推測 java.lang.OutOfMemoryError: Direct buffer memory

:あなたは、おそらくこのようなものが表示されます。ダイレクトバッファーに十分なスペースがない場合、これはヒープバッファーから割り振ります。私は正しい?

真実はあなたの推測よりもさらに簡単です。 AbstractByteBufAllocator.ioBufferは、それ以外の場合はバックheapBuffer

public ByteBuf ioBuffer() { 
    if (PlatformDependent.hasUnsafe()) { 
     return directBuffer(DEFAULT_INITIAL_CAPACITY); 
    } 
    return heapBuffer(DEFAULT_INITIAL_CAPACITY); 
} 
+0

を使用する下がる、限り、それはクラスパス上sun.misc.Unsafeを見つけることができるよう、あなたのためdirectBufferを呼び出します。私は、合計で16ギガバイトの物理メモリがあると、私はたったの約8ギガバイトにJVMのヒープを構成する必要があります(50%)ので、他のものはダイレクトバッファーで使用できますか? –

関連する問題