2

Я создал Pdf в своем веб-приложении Java, и я отправляю его как вложение электронной почты. Pdf создается как массив byte[]. Лучше обернуть его в ByteArrayInputStream или оставить его как byte[].Оптимизация памяти Java (как избежать утечки памяти - конкретный пример)

Обертывание может быть лучше для открепления памяти (прочитать принятый ответ в this потоке), но недостаток будет то, что InputStream (если я прав) создает копию массива (читайте here).

Что лучше избегать возможности иметь свиней памяти?

+2

«Обхват памяти» - моя новая любимая фраза! –

+0

Зачем вам беспокоиться о утечке памяти в среде сбора мусора? Если вы не знаете о какой-то определенной ошибке в JVM, которая вызывает утечку памяти, но вы ничего не упомянули. –

+0

Я имел в виду память hogs .... :) – Atticus

ответ

3

No, ByteArrayInputStreamwraps массив, он не копирует его. Из the documentation (конструктора принимая byte[]):

Создает ByteArrayInputStream так, что он использует ЬиЕ в качестве буферного массива. Буферный массив не копируется. Начальное значение pos равно 0, а начальное значение count - длина buf.

Вполне возможно, что все, что использует входной поток будет копировать его, но ByteArrayInputStream сам не будет.

Я не уверен, что вы действительно беспокоитесь о особенно важной проблеме - я не думаю, что это фактически создало бы утечку памяти вообще, просто используя массив байтов.

+0

Я читал ответ, который упоминал использование байта [] вместо InputStream, чтобы сохранить webapp из памяти свиней, и я не знал, действительно ли это проблема. – Atticus

+0

@Atticus: Я, конечно, не стал бы предполагать, что это проблема, не понимая, почему автор этого ответа * утверждал, что это «всплеск памяти». Я подозреваю, что это позволяет передавать данные, а не копировать их в память, но это может быть или не быть релевантным в вашей ситуации. Как всегда, важно понимать контекст других ответов и относится ли этот контекст к вам. –

Смежные вопросы