我已经调查了大部分可用的方法来找出Java进程实际使用了多少内存。
到目前为止,我可以说我知道总共分配的内存可能是以下一项或多项:
堆内存(应该由-XX:MaxHeapSize = 4096m控制)
永久内存(应该由-XX:MaxPermSize = 1024m控制)
保留代码缓存(应该由-XX:ReservedCodeCacheSize = 256m控制)
N个线程*线程大小(应该由-XX:ThreadStackSize = 1024控制)
但是,我发现通过所有我找到的方法来获取Java进程的内存消耗和Linux告诉我的结果相差太大。
在我的情况下,这是一个位于Ubuntu 11.10 x86_64机器上运行的Tomcat实例,JVM 1.6_u26 64位。ps -ALcf | grep org.apache.catalina.startup.Bootstrap | wc -l告诉我有145个线程或进程正在运行,并且与同一根进程(Tomcat)链接。
所有这些加起来应该给我最大总内存: (4096MB)+(1024MB)+(256MB)+ 145 *(1024KB)= 5521MB。 jmap -heap PID告诉我的内容,ManagementFactory.memoryMXBean。(heapMemoryUsage + nonHeapMemoryUsage).getCommitted()告诉我的内容和理论值都是相等的。
现在到Linux方面,top和nmon都告诉我,这个进程分配的ResidentMemory是5.8GB->大约5939.2 MB。但是我也知道这只是内存的一部分,即在实时RAM内存中的部分。top的VIRT和nmon的Size(两者都应该代表相同)告诉我,该进程为7530MB(或者精确地说是7710952KB通过nmon)。 这与预期的最大值相差太大:比最大值大了2009MB,并且根据jmap和jstat,堆内存分配甚至没有达到峰值(2048-OldSpace + 1534-Eden_+_Survivors)。
top还告诉我代码栈为36KB(对于初始catalina starter来说很好),数据栈为7.3GB(表示其他部分)。
这个Tomcat服务器实例是唯一在这台机器上运行的,并且出现了一些不稳定的情况。每三天左右需要重新启动,因为机器只有7647544k可用内存,而没有交换空间(出于性能原因)。我计算了限制条件,希望进程遵循它们,我发现这是一个非常好的安全边际,适用于在机器上运行的所有其他服务(除了ssh和top本身,不应该有其他麻烦):7468-5521=1947。这几乎是一个过高的“安全边际”。
所以,我想了解所有那些内存被使用了,并且为什么没有遵守限制。如果缺少任何信息,我将很乐意提供。
堆内存(应该由-XX:MaxHeapSize = 4096m控制)
永久内存(应该由-XX:MaxPermSize = 1024m控制)
保留代码缓存(应该由-XX:ReservedCodeCacheSize = 256m控制)
N个线程*线程大小(应该由-XX:ThreadStackSize = 1024控制)
但是,我发现通过所有我找到的方法来获取Java进程的内存消耗和Linux告诉我的结果相差太大。
在我的情况下,这是一个位于Ubuntu 11.10 x86_64机器上运行的Tomcat实例,JVM 1.6_u26 64位。ps -ALcf | grep org.apache.catalina.startup.Bootstrap | wc -l告诉我有145个线程或进程正在运行,并且与同一根进程(Tomcat)链接。
所有这些加起来应该给我最大总内存: (4096MB)+(1024MB)+(256MB)+ 145 *(1024KB)= 5521MB。 jmap -heap PID告诉我的内容,ManagementFactory.memoryMXBean。(heapMemoryUsage + nonHeapMemoryUsage).getCommitted()告诉我的内容和理论值都是相等的。
现在到Linux方面,top和nmon都告诉我,这个进程分配的ResidentMemory是5.8GB->大约5939.2 MB。但是我也知道这只是内存的一部分,即在实时RAM内存中的部分。top的VIRT和nmon的Size(两者都应该代表相同)告诉我,该进程为7530MB(或者精确地说是7710952KB通过nmon)。 这与预期的最大值相差太大:比最大值大了2009MB,并且根据jmap和jstat,堆内存分配甚至没有达到峰值(2048-OldSpace + 1534-Eden_+_Survivors)。
top还告诉我代码栈为36KB(对于初始catalina starter来说很好),数据栈为7.3GB(表示其他部分)。
这个Tomcat服务器实例是唯一在这台机器上运行的,并且出现了一些不稳定的情况。每三天左右需要重新启动,因为机器只有7647544k可用内存,而没有交换空间(出于性能原因)。我计算了限制条件,希望进程遵循它们,我发现这是一个非常好的安全边际,适用于在机器上运行的所有其他服务(除了ssh和top本身,不应该有其他麻烦):7468-5521=1947。这几乎是一个过高的“安全边际”。
所以,我想了解所有那些内存被使用了,并且为什么没有遵守限制。如果缺少任何信息,我将很乐意提供。