Слишком много мусора на Java - PullRequest
3 голосов
/ 17 января 2011

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

Ответы [ 3 ]

4 голосов
/ 17 января 2011

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

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

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

0 голосов
/ 17 января 2011
  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#wp1130305
0 голосов
/ 17 января 2011

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

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

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

...