Java G1 Сборщик мусора занимает много памяти - PullRequest
0 голосов
/ 03 сентября 2018

У меня есть проект с большой базой данных. Для разбора я использую Java с сборщиком мусора G1. Когда программа работает в течение длительного периода времени, Java начинает потреблять много памяти. Но когда я проверяю кучу Java, размер намного меньше. Например:

  • Java занимает 20 ГБ ОЗУ
  • "jmap -histo" - показывает мне, что куча составляет около 5 ГБ ОЗУ

Вопрос: что занимает остальная часть моей оперативной памяти? Это накладные расходы G1?

Редактировать: вот статистика

RAM stats of my java procces: allocated ~50gb, consumed ~20gb

jmap info: heap size ~4gb

Java-процессы: выделено ~ 50 ГБ, использовано ~ 20 ГБ
Информация о Jmap: размер кучи ~ 4 ГБ

Ответы [ 2 ]

0 голосов
/ 05 сентября 2018

Я понял проблему. Как упомянул @Holger, оперативная память выделена для процесса Java, но не полностью заполнена кучей. Но причина , почему G1 выделяет так много оперативной памяти:

G1 страдает, если ему нужно выделить много огромных регионов. Они будут создаваться каждый раз, когда размер объекта> 50% от размера региона. Они будут тратить пространство, так как в регионе больше ничего не будет создано. Таким образом, если его размер составляет 51%, вы потеряете 49% территории региона. Хуже того, если область занимает 2 МБ, а ваш объект - 2,1 МБ, во втором регионе будет потрачено 1,9 МБ. Если вы выделяете большие объекты, настройте свой XX: G1HeapRegionSize.

0 голосов
/ 03 сентября 2018

Потребление ОЗУ будет связано с огромным размером базы и размером набора результатов .

Попробуйте следующее: Оптимизация сбора мусора:

  • остерегайтесь оператора конкатенации строк (+), вместо этого используйте concat ()

  • если используется пружина, попробуйте setFetchSize (количество строк, которые нужно извлечь за раз) использование setFetchSize, однако, увеличит ваше время для выполнения, но оно эффективно использует память

  • удалить все ненужные заявления

  • Использование асинхронного выполнения

...