【发布时间】:2011-04-08 11:17:51
【问题描述】:
我正在运行一些 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 来找出它们的内存占用。 根据我的计算大约占1700万。
接下来是 Java 线程堆栈,在 Linux 的 32 位 JVM 上每个线程有 320k。 同样,我使用 Psi-probe 来计算特定 JVM 上的线程数,总数为 129 个线程。所以 129 + 320k = 42M
我听说 NIO 使用堆外的内存,但我们不在应用程序中使用 NIO。
所以我在这里计算了(我)想到的所有内容。而我只占了“缺失”的 170M 中的 60M。
我错过了什么?
【问题讨论】:
-
我自己也一直在问同样的问题。我发现我们有一堆匿名页面(由 pmap 返回),大小从 65536k 到 65508k 不等。不确定这些是什么,但它们占我们内存使用量的三分之一左右。