Я запускаю несколько серверов приложений Java, на которых работают последние версии Tomcat 6 и Sun Java 6 поверх CentOS 5.5 Linux. Каждый сервер запускает несколько экземпляров Tomcat.
Я устанавливаю параметры -Xmx450m -XX: MaxPermSize = 192m, чтобы контролировать, насколько увеличится куча и пермг. Эти настройки применяются ко всем экземплярам Tomcat на всех серверах приложений Java, всего около 70 экземпляров Tomcat.
Вот типичное использование памяти одного из этих экземпляров Tomcat, как описано Psi-probe
Eden = 13M
Survivor = 1.5M
Perm Gen = 122M
Code Cache = 19M
Old Gen = 390M
Total = 537M
Однако CentOS сообщает об использовании ОЗУ для этого конкретного процесса на 707M (согласно RSS), который оставляет 170M RAM без учета.
Я знаю, что сам JVM и некоторые из его библиотек зависимостей должны быть загружены в память, поэтому я решил запустить pmap -d, чтобы узнать их объем памяти. По моим расчетам, на которые приходится около 17 млн.
Далее существует стек потоков Java, который составляет 320 тыс. на поток в 32-разрядной JVM для Linux. Опять же, я использую Psi-probe для подсчета количества потоков в этой конкретной JVM, а общее число - 129 потоков. Итак, 129 + 320k = 42M
Я читал, что NIO использует память за пределами кучи, но мы не используем NIO в наших приложениях.
Итак, здесь я вычислил все, что приходит (мой) ум. И я только учёл 60 миллионов "отсутствующих" 170M.
Что мне не хватает?