Не существует универсального решения для вашей проблемы: вам нужно хорошо разбираться в шаблонах распределения и жизнеспособности вашего приложения, и вам нужно знать, как это взаимодействует с конкретными алгоритм сбора мусора, который вы используете (функция версии Java и флаги командной строки передаются в java
).
Вообще говоря, Full GC (который успешно восстанавливает много места) означает, что множество объектов переживает второстепенные коллекции (но не протекает). Начните с рассмотрения размера ваших пространств Eden и Survivor: если Eden слишком мал, второстепенные коллекции будут выполняться очень часто, и, возможно, вы не дадите объекту умереть до того, как будет достигнут порог владения. Если Выжившие слишком малы, объекты будут преждевременно повышены до Старого поколения.
Настройка ГХ - это немного искусства: вы запускаете свое приложение, изучаете результаты, настраиваете некоторые параметры и запускаете его снова. Таким образом, вам потребуется эталонная версия вашего приложения, которая ведет себя как можно ближе к рабочей, но, надеюсь, не потребует 10 часов для создания полного GC.
Поскольку вы заявили, что используете Java 8 с настройками по умолчанию, я считаю, что это означает, что ваши старые коллекции работают с последовательным сборщиком. Вы можете увидеть некоторые очень быстрые улучшения, переключившись на параллельный коллектор для старого поколения (-XX: + UseParallelOldGC). Хотя это может уменьшить паузу в 1,5 минуты до некоторого количества секунд (в зависимости от количества ядер в вашем ящике и количества потоков, указанных для GC), это не уменьшит максимальную паузу до 20 мс.