2015-02-06 3 views
0

Когда мы создаем ByteBuffer, а затем постоянно его повторно используем, Java не делает GC на нем.Нет Netty без GC через ByteBuffers?

Netty предоставляет ByteBuffers для ввода и вывода.

Продолжает ли это повторное использование, сохраняя внутреннее позиционирование, чтобы буферы никогда не нуждались в сборке мусора?

Нужно ли что-то особенное выполнять разработчиком для обеспечения отсутствия GC?

+1

Утилизация буферов уменьшает количество мусора, но нетто не устраняет его, оно пытается уменьшить его до такой степени, что оно больше не оказывает существенного влияния на производительность. –

+0

Правильно, обычно было бы хуже, если бы у вас была программа с нулевым GC, а не позволяла создавать и отбрасывать несколько объектов по мере необходимости. Мой пост относится к памяти IO. Я утверждаю, что отслеживание местоположения и т. Д. Будет недоступно для этой должности. – BAR

+0

Что вы подразумеваете под «внутренним позиционированием»? AFAIK поддерживает ObjectPool. –

ответ

1

Netty 4 использует подсчет ссылок для управления жизненным циклом ByteBuf. Когда пул объединенного буфера освобождается, базовая область памяти возвращается в пул, так что область памяти не собирает мусор. Когда освобождается буфер без переохлаждения, базовая область памяти освобождается явно или устанавливается в значение null, так что JVM очищает ее позже. Разумеется, рекомендуется использовать объединенный буфер.

Подсчет ссылок имеет преимущество перед сборкой мусора:

  • Это можно реализовать пул буферов или аллокатора.
  • Можно отключить буферы со смещением во времени.

Мы надеялись реализовать пул буферов или освободить внедорожную кучу буферов на время без подсчета ссылок, но нет никакого способа, чтобы получить уведомление, как только объект становится недоступным в JVM.

+0

Почему бы просто не очистить байтовый buf или использовать его в качестве циклического байта buf? – BAR

+0

Hi Trustin, я не думаю, что получение уведомления о том, что объект становится недоступным, тоже не помогло бы. Это потому, что эти обнаружения не являются детерминированными, а также самой GC. Таким образом, вы в конечном итоге ожидаете уведомления, в то время как RAM заполняется. Здесь подсчитывается подсчет ссылок. В C++ у вас нет другого выбора. Умные указатели на самом деле просто ссылаются на подсчитанные указатели. На мой взгляд, это совершенно нормально. Оставайтесь с нами для Java 9, Unsafe, вероятно, будет частью JDK then =). – Kr0e

+0

На самом деле вы можете использовать WeakReferences или SoftReferences, а во время создания вы можете предоставить ReferenceQueue, который может уведомить вас, когда новая ссылка стала недоступной. Дополнительную информацию см. В http://stackoverflow.com/questions/14450538/using-javas-referencequeue#14450693. –