Слишком много мусора на Java

У меня есть приложение, в основном, создать новый байтовый массив (менее 1 КБ), хранить некоторые данные через несколько секунд (как правило, менее 1 минуты, но некоторые данные хранятся до 1 часа) записи на диск, и данные будут отправлены в мусор. Создано около 400 пакетов в секунду. Я прочитал несколько статей, в которых говорится, что не беспокойтесь о GC, особенно быстро создаваемых и освобождаемых частях памяти (на Java 6). GC работает слишком долго, что вызывает проблемы в моем приложении. Я установил некоторые параметры GC (Bigger XMX и ParalelGC), это уменьшение уменьшает полное время GC, но пока недостаточно. У меня есть 2 идеи, я фокусирую параметры GC или создаю механизм пула памяти байтового массива? Какой из них лучше?

3 ответа

Решение

Я предлагаю вам проанализировать, почему GC работает недостаточно хорошо для вас. Ты можешь использовать jmap вывалить кучу, а затем использовать jhat или Eclipse Memory Analyzer, чтобы увидеть, какие объекты в нем живут. Вы можете обнаружить, что держитесь за ссылки, которые вам больше не нужны.

GC очень умный, и вы могли бы даже усугубить ситуацию, пытаясь перехитрить его своим собственным кодом управления памятью. Попробуйте настроить параметры, и, возможно, вы также можете попробовать новый G1 Garbage Collector.

Также помните, что GC любит недолговечные неизменные объекты.

Частота выполнения GC зависит от размера объекта, но стоимость (время очистки) больше зависит от количества объектов. Я подозреваю, что долгоживущие массивы копируются между пространствами, пока они не окажутся в старом пространстве и, наконец, не будут удалены. Уборка старого поколения относительно дорога.

Я предлагаю вам попробовать использовать ByteBuffer для хранения данных. Они похожи на byte[], но имеют переменный размер и могут быть немного более эффективными, если вы можете использовать прямые байтовые буферы с NIO. Предварительное распределение ваших буферов может быть более эффективным для предварительного распределения ваших буферов. (хотя может тратить виртуальную память)

Кстати: прямые байтовые буферы занимают мало места в куче, так как они используют память в пространстве "C".

  1. Используйте профилировщик для определения фрагмента кода
  2. Попробуйте с WeakReferences.
  3. Предложить алгоритм GC виртуальной машине
-Xgc: parallel
  1. Установить большую кучу и общий мем
-XX:+UseISM -XX:+AggressiveHeap
  1. установить ниже для сборки мусора.

-XX:SurvivorRatio 8

  1. Это может помочь http://download.oracle.com/docs/cd/E12840_01/wls/docs103/perform/JVMTuning.html
Другие вопросы по тегам