Моя виртуальная машина Java - в основном искровый исполнитель, который выполняет задачи одну за другой.Задача требует много памяти и требует значительного объема памяти в течение своего жизненного цикла.
JConsole и JVisualVM сообщают бок о бок
Вышеупомянутая JVM работает в G1GC с параметрами по умолчанию.Как вы можете видеть в отчете VisualVM справа от 4:25 до 16:32, скачки происходят из-за каждой задачи, выполняемой исполнителем (по сути, каждый скачок происходит из-за того, что исполнитель выбирает новую задачу послепредыдущий закончен).Когда я запустил ручной сборщик мусора в 4:35, я увидел резкое снижение использования кучи.Кроме того, как вы можете видеть с левой стороны в отчете JConsole, G1GC никогда не собирает пространство старого поколения (резкое сокращение пространства старого поколения непосредственно перед 16:35 связано с ручным сбором мусора).Поскольку мое приложение является приложением пакетного задания, я в порядке, если JVM потратили много времени на сборку мусора.Но у меня мало памяти.Итак, я хотел знать, как я могу настроить параметры JVM G1GC так, чтобы там были более частые GC (при этом также собиралось пространство старого поколения), и я мог выполнить работу со значительно меньшим пространством кучи (XMX).