Высокая виртуальная память JVM в SUSe 12 против SuSe 11 - PullRequest
1 голос
/ 12 июня 2019

Запуск этой простой Java-программы в наших системах SLES12 резервирует 4 ГБ виртуальной памяти:

class Test {  
  public static void main(String[] args) throws Exception {
    Thread.sleep(100000);    
  }
}

Я смог уменьшить ее до 1 ГБ, используя следующие флаги:

java -Xmx1m -XX:ReservedCodeCacheSize=5m -XX:CompressedClassSpaceSize=5m -Xss228k -XX:LargePageSizeInBytes=1m -XX:MaxDirectMemorySize=1k Test

Тем не менее,в нашей системе SLES11 (с тем же объемом памяти) это занимает всего 200M.Я проверил все пулы памяти с помощью jconsole, и ничего большого не встало.Оба работают с OpenJDK 8.0.202.Есть идеи, как избежать этого резервирования памяти?

1 Ответ

2 голосов
/ 13 июня 2019

Я использовал 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 КБ с этими параметрами.

Примечание: я сфокусировал резервирование памяти.Я не учитывал производительность приложения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...