Это вовсе не означает, что вы не должны добавлять в свой продукт новые возможности или новый код; разумеется, совершенствование программ приносит пользу. Но вы должны знать о тех компромиссах, на которые вам придется пойти, и упрощать свой код там, где это возможно.
JVM может сохранять стеки потоков только в точках безопасного состояния. Во-вторых, стеки для каждого потока сохраняются последовательно, поэтому полученная из них информация может быть противоречивой: два потока могут удерживать одну блокировку или же поток ожидает блокировку, которая не удерживается никаким другим потоком. Стеки потоков также могут показать, насколько серьезно блокируются потоки (так как заблокированный поток уже находится в безопасном состоянии). Если последовательно сохраненные дампы потоков показывают, что многие потоки находятся в ожидании блокировки, можно сделать вывод, что за эту блокировку есть значительная конкуренция. Если последовательно сохраненные дампы потоков показывают, что многие потоки блокируются в ожидании ввода/вывода, можно сделать вывод, что ввод/вывод нуждается в настройке
РЕЗЮМЕ • Настройку уборки мусора G1 следует начать с выбора разумного целевого времени продолжительности паузы. • Если после этого полная уборка мусора все еще создает проблемы, а размер кучи не может быть увеличен, применяются конкретные настройки в зависимости от типа сбоев: • чтобы фоновые потоки выполнялись чаще, измените InitiatingHeapOccupancyPercent; • если доступны дополнительные процессоры, отрегулируйте количество потоков при помощи флага ConcGCThreads flag; • чтобы предотвратить сбои поведения, уменьшите значение G1MixedGCCountTarget.
Для предотвращения полной уборки мусора возможны следующие варианты: • Увеличить размер старого поколения либо за счет увеличения общего размера кучи, либо регулировкой соотношения между поколениями. • Увеличить количество фоновых потоков (при наличии достаточных ресурсов процессора). • Чаще выполнять фоновые операции уборщика мусора G1. • Увеличить объем работы, выполняемой в циклах смешанной уборки.
Уборщик мусора G1 использует несколько циклов (и фаз в конкурентном цикле). На хорошо настроенной JVM, на которой работает уборщик G1, должны происходить только циклы уборки в молодом поколении, смешанной и конкурентной уборки мусора.
Уборка мусора G1 состоит из четырех логических операций: • Уборка в молодом поколении. • Фоновый конкурентный цикл пометки. • Смешанная уборка. • При необходимости — полная уборка мусора.