Linux上的Java内存使用情况

Arn*_*son 12 java linux memory

我正在运行一大堆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
Run Code Online (Sandbox Code Playgroud)

然而,CentOS报告这个特定进程的RAM使用率为707M(根据RSS),这使得170M的RAM下落不明.

我知道JVM本身和它的一些依赖库必须加载到内存中,所以我决定启动pmap -d来查找它们的内存占用.根据我的计算,约占17M.

接下来是Java线程堆栈,在32位JVM for Linux上每个线程为320k.同样,我使用Psi-probe来计算特定JVM上的线程数,总计为129个线程.所以129 + 320k = 42M

我已经读过NIO使用堆外的内存,但我们不在我们的应用程序中使用NIO.

所以在这里,我已经计算了(我的)头脑中的一切.我只占了"失踪"170M的60M.

我错过了什么?

Ani*_*noi 2

Arnar,在JVM初始化过程中,JVM会分配-Xmx和MaxPermSize指定大小的内存(mmap或malloc),所以无论如何,JVM会在JVM进程启动时为应用程序分配450+192=642m的堆空间。所以应用程序的java堆空间不是537而是642m。所以现在如果你进行计算,它会给你你丢失的内存。希望它有帮助。