Что я сделал, чтобы «обработка слабых ссылок» заняла 30 секунд вместо 1,5 секунд? - PullRequest
11 голосов
/ 24 марта 2011

История

Мой сервер работает с процессорами 24x2, а размер кучи Java составляет около 70 ГБ.В какой-то момент после установки новой версии (версия-B) я увидел, что Full GC занимает около 30 секунд (останавливая все потоки).После включения XX: + ParallelRefProcEnabled обработка слабых ссылок снизилась до 3-6 секунд.Но это всего лишь «помощь при изгибе», а не лекарство.

2011-03-22T20: 38: 24.276 + 0000: 29540.794: [GC [Занятость YG: 5477281 K (7549760 K)]29540.794: [Повторное сканирование (параллельное), 0,4083780 с] 29541,203: [обработка слабых ссылок, 3,2855240 с] 29544,488: [разгрузка классов, 0,0187270 с] 29544,50: [таблицы символов и строк очистки, 0,0095530 с] [1 CMS-примечание: 102801236K (114294784K)] 108278518K (121844544K), 3,7319690 с] [Время: пользователь = 65,53 sys = 0,14, реальное = 3,73 с]

До версии-B (и без флага ParallelRefProcEnabled) слабая ссылкаОбработка занимала около 1,5 сек.(Примерно для той же нагрузки)

Цель:

Я пытаюсь выяснить, в чем заключалось изменение, внесенное в версию B, из-за которой скорость обработки возросла с 1,5 с до30 секВ версии B есть несколько изменений, и нет никаких реальных подозрений, связанных со слабыми ссылками.

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

Вопросы:

  • Я хотел бы понять, что именно происходит на этапе "обработки слабых ссылок", чтобы я мог найти подозреваемого или оправдать переписывание кода.Любой хороший ресурс для чтения о том, что именно происходит на этом этапе?

  • Каковы возможные причины длительной "слабой обработки ссылок"?(Количество экземпляров слабых ссылок, количество объектов, содержащих слабые ссылки, глубина дерева ссылок, на которое есть слабые ссылки, ...)

Дополнительная информация:

  • Загрузка ЦП не так высока и, похоже, не является проблемой
  • GC (который включает в себя обработку слабых ссылок) происходит примерно каждые 8 ​​минут.
  • Запуск Java Sun, 1.6.0_20

Буду признателен за любой ответ, Спасибо, Эрез.

1 Ответ

1 голос
/ 24 марта 2011

AFAIK, Время обработки ссылки - это время, которое требуется, чтобы определить, можно ли собирать ссылку или нет. Это должно быть пропорционально количеству имеющихся у вас слабых ссылок.

Возможно, возможно изменение структуры данных, что значительно уменьшает количество слабых ссылок. например скажем, у вас есть кэш, используя карту WeakReferences. Если это можно заменить на WeakReference на карту, вы можете получить тот же результат, но со значительно меньшим количеством ссылок.

Вы можете увидеть улучшение производительности в Java 6 с обновлением 24, в котором установлена ​​гораздо более новая JVM (примерно на год новее)

...