Ядро Ubuntu убивает процесс Java, даже если ему не хватает памяти - PullRequest
0 голосов
/ 06 мая 2019

У меня есть экземпляр ec2 с 48 ядрами и 192 ГБ памяти и Ubuntu 18.04. Я использую Java-приложение, в котором максимальная память установлена ​​на 128 ГБ. В промежутке между приложениями java ядро ​​linux уничтожается. Я подключил JVisualVM, а также в журналах GC говорится, что виртуальная машина Java занимает максимум 50 ГБ. Так почему Linux убивает Java-приложение? На этой машине больше ничего не работает, кроме приложения. Я попытался запустить dmesg, и я вижу:

[166098.587603] Out of memory: Kill process 10273 (java) score 992 or sacrifice child
[166098.591428] Killed process 10273 (java) total-vm:287522172kB, anon-rss:191924060kB, file-rss:0kB, shmem-rss:0kB
[166104.034642] oom_reaper: reaped process 10273 (java), now anon-rss:0kB, file-rss:0kB, shmem-rss:0kB

1 Ответ

3 голосов
/ 06 мая 2019

Ключевая вещь, на которую стоит обратить внимание, это anon-rss:191924060kB. RSS - это Размер резидентного набора , который статья в Википедии определяет как

часть памяти, занятая процессом, который содержится в основной памяти

Если ввести запятые, 191 924 060 КБ - это всего лишь 192 ГБ. Из них 50 ГБ - это часть кучи Java - пространство, которое Java использует для объектов, выделенных во время выполнения, - которое фактически используется. Остальное включает среду выполнения JVM, любые библиотеки, которые может использовать ваша программа, и, конечно, сама ваша программа.

Общий объем виртуальной памяти, занимаемой вашей программой, составляет 287,5 ГБ; по-видимому, включает в себя остальные 78 ГБ из 128 ГБ кучи, которую вы выделили.

...