Я использовал Windows 10 и Java 1.8.0_201.Я запускаю это приложение с вашими параметрами и -XX: NativeMemoryTracking = summary paremeter, я получил следующий результат:
Отслеживание собственной памяти:
Всего:зарезервировано = 49889 КБ, зафиксировано = 38613 КБ
Зарезервированная память представляет собой общий объем памяти, который наше приложение может потенциально использовать.И наоборот, выделенная память равна объему памяти, используемому нашим приложением прямо сейчас.Java 8 использует Parallel GC в качестве gc по умолчанию.Поэтому я добавил -XX: + UseSerialGC paremeter для изменения алгоритма GC по умолчанию, и я получил результат, как показано ниже:
Отслеживание собственной памяти:
Всего: зарезервировано= 29565 КБ, зафиксировано = 18349 КБ
Поскольку область фиксации класса, потока, внутренней области и gc уменьшена.Вы можете найти необходимую информацию в oracle docs. JIT-компиляторы имеют потоки, и эти потоки занимают область.Я использовал -XX: CICompilerCount = 1 и -XX: -TieredCompilation для сокращения количества потоков компилятора.Результат:
Отслеживание собственной памяти:
Всего: зарезервировано = 27481 КБ, зафиксировано = 16265 КБ
** * Я неРекомендую вам сделать следующее.Это не гарантия, может неожиданно вылететь.Только я пытаюсь ответить на вопрос.* **
Я сократил размер стека для потоков виртуальных машин с параметром "-XX: VMThreadStackSize = 256".Результат:
Итого: зарезервировано = 25177 КБ, зафиксировано = 13961 КБ
Результат: мы сократили объединенную область с 38613 КБ до 13961 КБ и зарезервированную область с 49889 КБ до 25177 КБ с этими параметрами.
Примечание: я сфокусировал резервирование памяти.Я не учитывал производительность приложения.