Что я сделал, чтобы "слабая обработка refs" занимала 30 секунд вместо 1,5 секунд?

История

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

2011-03-22T20: 38: 24,276 + 0000: 29540,794: [GC [заполнение YG: 5477281 K (7549760 K)] 29540,794: [Rescan (параллельно), 0,4083780 сек] 29541,203: [слабая обработка refs, 3.2855240 сек] 29544.488: [разгрузка классов, 0.0187270 сек.] 29544.507: [символ скраба и строковые таблицы, 0,0095530 secs] [1 Замечание CMS: 102801236K (114294784K)] 108278518K (121844544K), 3.7319690 secs] [Times: user = 65.53 sys = 0.14, real = 3,73 с]

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

Цель:

То, что я пытаюсь выяснить, - это то, что было изменено в версии-B, которая заставила обработку прыгать с 1,5 сек до 30 секунд. Есть несколько изменений в версии-B, и нет реального подозреваемого, связанного с слабыми ссылками.

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

Вопросы:

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

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

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

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

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

Ответ 1

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

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

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