В статье, которую вы упоминаете ( Почему мой Java-процесс потребляет больше памяти, чем Xmx? ), в ней четко обрисовывается.
Процесс Java требует памяти для нескольких вещей:
- куча Java (пул выделения памяти)
- Стек для каждой темы в вашем приложении
- Память, используемая самой JVM (иначе как permgen)
- Память, выделенная собственными функциями (JRE или сторонние библиотеки)
Дополнительная проблема заключается в том, что некоторая память JVM не считается permgen памятью и не может управляться.
Так что, если вы хотите ограничить свое Java-приложение до 40 ГБ, вы должны учитывать все типы памяти. Начните с меньших значений, например:
-Xmx30g -XX:MaxPermSize=1g -Xss1m
Затем проследите за использованием памяти вашего процесса и увеличьте Xmx
, если процесс безопасно остается в стороне от целевых 40 ГБ.