4

VM 間でオブジェクトを通信するためにnettyを調べます。ObjectEncoder&をそれぞれ使用ObjectDecoderして、これらをシリアル化します。

このソリューションは最大 1MB サイズのオブジェクトに制限されていることがすぐにわかりました。より大きなオブジェクトを通信するつもりであり、このサイズを制限するつもりはないためInteger.MAX_VALUE、最大フレーム長を設定していました。

残念ながら、この値は一部の buffer を初期化するために取得されているように見えるため、不必要な GC が発生し、OutOfMemory になる可能性が非常に高くなります。

DynamicChannelBuffers を使用しているときに無制限の ObjectEncoder/Decoder を作成して、メモリが無駄にならないようにする方法はありますか?

4

1 に答える 1

4

ObjectDecoder拡張LengthFieldBasedFrameDecoderする拡張しFrameDecoderます。 FrameDecoderはデコード バッファを管理し、初期容量が の動的バッファを使用し256ます。

ただし、大きなオブジェクトを受け取ると、動的バッファーは自動的に拡張されますが、縮小されることはありません。大きなオブジェクトを交換する複数の接続がある場合、ObjectDecoder最終的にすべての接続で非常に大きなバッファが発生し、OutOfMemoryError.

この問題は先週修正され、新しいリリース (3.2.7.Final) が今週リリースされる予定です。

于 2011-11-09T18:55:03.187 に答える