Вы не можете контролировать то, что хотите контролировать , -Xmx
контролирует только Java Heap, оно не контролирует потребление собственной памяти JVM, которая является потребляется совершенно по-разному в зависимости от реализации.
Из следующей статьи Спасибо за память (Понимание того, как JVM использует собственную память в Windows и Linux)
Для обслуживания кучи и сборщика мусора используется собственная память, которой вы не можете управлять.
Для сохранения состояния
система управления памятью, поддерживающая кучу Java. Структуры данных
должны быть выделены для отслеживания свободного хранения и записи прогресса, когда
собирать мусор. Точный размер и характер этих структур данных
зависит от реализации, но многие из них пропорциональны размеру
куча.
и JIT-компилятор использует собственную память так же, как javac
Компиляция байт-кода использует собственную память (так же, как статическая
компилятору, такому как gcc, требуется память для запуска), но оба ввода (
байт-код) и вывод (исполняемый код) из JIT также должны
храниться в родной памяти. Java-приложения, которые содержат много
JIT-скомпилированные методы используют больше собственной памяти, чем меньшие приложения.
и затем у вас есть загрузчик классов, которые используют собственную память
Java-приложения состоят из классов, которые определяют структуру объекта
и метод логики. Они также используют классы из класса времени выполнения Java
библиотеки (такие как java.lang.String) и могут использовать сторонние
библиотеки. Эти классы должны храниться в памяти до тех пор, пока
они используются. Как хранятся классы, зависит от реализации.
Я даже не стану цитировать раздел «Потоки», думаю, вы поняли, что
-Xmx
не контролирует то, что вы думаете, он контролирует, он контролирует кучу JVM, не все
идет в кучу JVM, и куча занимает гораздо больше родной памяти, чем указано для
управление и бухгалтерский учет.