История
Мой сервер работает с процессорами 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
Буду признателен за любой ответ, Благодаря, Эрез.