Я очень озадачен проблемой, которую я наблюдаю в нашем серверном приложении.
- Сервер представляет собой машину CentOS 7 с 48 ядрами и 64 ГБ памяти.
- Java — это OpenJDK 8.
- Сервер приложений — WildFly 9.
- Память и параметры GC:
-Xss256k -Xmx8192m -XX:+UseG1GC -XX:MaxGCPauseMillis=20
Основной вариант использования получает запросы CORBA в одном Java-процессе и делегирует их, вызывая для обработки удаленные EJB-компоненты в WildFly.1 Из-за большого количества параллельных запросов такого типа мы увеличили количество удаленных подключений в подсистема ejb3.0 конфигурации WildFly до 1000: <max-threads count="1000" />
Теперь странная вещь, которую мы наблюдаем, заключается в том, что размер кучи (например, при наблюдении через VisualVM) составляет 8 ГБ, как установлено, и GC постоянно работает, так что используется около 6-7 ГБ кучи, а количество потоков относится к настройке. И память, и потоки не увеличиваются со временем. В то же время, наблюдая за PID с top
после некоторого времени работы, мы видим, что используются потрясающие 42G!
Может ли кто-нибудь объяснить мне, как возможно, что процесс java потребляет гораздо больше памяти, чем установлено свойствами X JVM?
1 Я знаю, что мы говорим об очень старой технологии, но приложение такое, какое оно есть, и мы не можем это изменить в ближайшем будущем. Он должен продержаться некоторое время в производстве, пока у нас не появится возможность перейти на более современную технологию.