Как использовать неограниченные размеры кадров в JBoss-Netty без потери памяти? - PullRequest
4 голосов
/ 09 ноября 2011

Я исследую netty для связи Объектов между виртуальными машинами.Я использую ObjectEncoder & ObjectDecoder соответственно для их сериализации.

Я быстро обнаружил, что это решение ограничено объектами размером до 1 МБ.Поскольку я намереваюсь обмениваться более крупными объектами, и, поскольку я не намерен ограничивать этот размер, я использовал Integer.MAX_VALUE для установки максимальной длины кадра.

К сожалению, похоже, что это значение выбрано для инициализациинекоторые буферы , что приводит к ненужному сбору мусора и весьма вероятно в OutOfMemory.

Есть ли способ создать неограниченный ObjectEncoder / Decoder при использовании DynamicChannelBuffers, чтобы не тратить слишком много памяти?

1 Ответ

4 голосов
/ 09 ноября 2011

ObjectDecoder расширяется LengthFieldBasedFrameDecoder, что расширяется FrameDecoder.FrameDecoder управляет буфером декодирования и использует динамический буфер с начальной емкостью 256.

Однако, как только вы получаете большой объект, динамический буфер сам расширяется, но никогда не сжимается.Если у вас есть несколько соединений, которые обмениваются большими объектами, у вашего ObjectDecoder будет очень большой буфер со временем, что может привести к OutOfMemoryError.

Эта проблема была исправлена ​​на прошлой неделе и в новом выпуске (3.2.7.Final) выйдет на этой неделе.

...