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