Java G1 GC занимает слишком много памяти - PullRequest
0 голосов
/ 02 июля 2019

Например, я установил -Xmx как 40G.Я ожидаю, что мой процессор Java не будет использовать более 40G.

Моя программа работает нормально с cms-gc.

Но когда я перехожу на G1 gc с той же памятью (даже на 15% больше памяти).

Это всегда убивает oom killer.

Я нашел такую ​​статью: Почему мой Java-процесс потребляет больше памяти, чем Xmx?

Он выражает:

 G1 is especially known for its 
 excessive appetite for additional memory, so be aware of this.

Итак, я хочу знать, как ограничить память, используемую g1 gcи почему g1 использует столько дополнительной памяти

1 Ответ

0 голосов
/ 02 июля 2019

В статье, которую вы упоминаете ( Почему мой Java-процесс потребляет больше памяти, чем Xmx? ), в ней четко обрисовывается.

Процесс Java требует памяти для нескольких вещей:

  • куча Java (пул выделения памяти)
  • Стек для каждой темы в вашем приложении
  • Память, используемая самой JVM (иначе как permgen)
  • Память, выделенная собственными функциями (JRE или сторонние библиотеки)

Дополнительная проблема заключается в том, что некоторая память JVM не считается permgen памятью и не может управляться.

Так что, если вы хотите ограничить свое Java-приложение до 40 ГБ, вы должны учитывать все типы памяти. Начните с меньших значений, например:

-Xmx30g -XX:MaxPermSize=1g -Xss1m

Затем проследите за использованием памяти вашего процесса и увеличьте Xmx, если процесс безопасно остается в стороне от целевых 40 ГБ.

...