Ваш Java процесс выполнен , а не только из памяти кучи, посмотрите это для хорошего примера .
Теперь вы говорите, что у вас есть 28GB
ОЗУ, из которого вы выделяете 20GB
для кучи только . Вы не только резервируете виртуальную память, но и делаете ее через AlwaysPreTouch
(теперь я сомневаюсь, что вы даже понимаете, что это делает). Таким образом, ваша ОС отображает 20GB
ОЗУ в вашем процессе (упрощенное объяснение).
Даже если вы видите, что занят только 50%
, используемый вами сборщик мусора - не освобождает память обратно в ОС, поэтому все 20GC
равны всегда занят и не может быть повторно использован каким-либо другим процессом. Таким образом, бессмысленно измерять или контролировать кучу.
Ваш процесс завершается с ошибкой Native memory allocation (mmap) failed to map...
, как сказано, это не связано с кучей. Сбой в родной памяти , это !=
куча. Я также не знаю специфику вашего приложения, но -XX:+DisableExplicitGC
не может быть хорошим вариантом; вместо этого вы можете включить параллельный вызов (если ваш G C поддерживает это) через -XX:+ExplicitGCInvokesConcurrent
.
Похоже, вы также используете CMS
сборщик мусора, который устарел.