Linux 上的 Java 内存使用情况
我正在运行一些Java应用程序服务器,这些服务器都在CentOS 5.5 Linux上运行最新版本的Tomcat 6和Sun的Java 6。每个服务器运行多个 Tomcat 实例。
我正在设置 -Xmx450m -XX:MaxPermSize=192m 参数来控制堆和 permgen 将增长到多大。这些设置适用于所有 Java 应用程序服务器上的所有 Tomcat 实例,总共约 70 个 Tomcat 实例。
下面是 Psi-probe 报告的其中一个 Tomcat 实例的典型内存使用情况
Eden = 13M
Survivor = 1.5M
Perm Gen = 122M
Code Cache = 19M
Old Gen = 390M
Total = 537M
然而,CentOS报告此特定进程的RAM使用率为707M(根据RSS),剩下170M的RAM无法解释。
我知道JVM本身和它的一些依赖性库必须加载到内存中,所以我决定启动pmap -d来找出它们的内存占用量。根据我的计算,约占17M。
接下来是Java线程堆栈,它是Linux的32位JVM上每个线程320k。同样,我使用 Psi-probe 来计算该特定 JVM 上的线程数,总数为 129 个线程。所以 129 + 320k = 42M
我读过NIO在堆外使用内存,但我们在应用程序中不使用NIO。
所以在这里,我已经计算了(我)想到的一切。我只占了“失踪”的170M中的60M。
我错过了什么?