Я использую несколько серверов приложений Java, на которых установлены последние версии Tomcat 6 и Sun 6 от Sun в сочетании с CentOS 5.5 Linux.Каждый сервер запускает несколько экземпляров Tomcat.
Я устанавливаю параметры -Xmx450m -XX: MaxPermSize = 192m, чтобы контролировать размер кучи и permgen.Эти параметры применяются ко всем экземплярам 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 млн. Пропавших без вести 170 млн.
Чего мне не хватает?