我一直在研究的应用程序已经展示了大量的堆外内存使用情况。
我已将应用程序配置为使用4096m的Xms和Xmx。然而,在PID上运行顶部显示该过程消耗了机器内存的9.6%(64gb机器 - > 6.14g应用程序占用空间)。 实例活动的时间越长,这似乎会继续增长。居民大小约为5.9g。使用jvisualvm检查进程我看到大约1.5gb的堆使用情况,具有健康的GC模式。我已经提取了堆转储和线程转储,但没有看到任何异常。
我为这个过程提取了一个pmap。堆大小看起来与应用程序Xms和Xmx参数一致。堆栈大约130Kb。我注意到了大量的匿名记忆:
service
gc行为的一些示例:
00000006c0000000 4195968K 1437248K 1437248K 1437248K 0K rw-p [anon]
00000007c01a0000 1046912K 0K 0K 0K 0K ---p [anon]
00007ff712acd000 230464K 0K 0K 0K 0K ---p [anon]
00007ff7077cb000 148452K 10452K 10452K 10452K 0K rw-p [anon]
00007ff711bdd000 15296K 15224K 15224K 15224K 0K rwxp [anon]
00007ff7109c6000 14924K 14692K 14692K 14692K 0K rw-p [anon]
该应用程序有大约15个线程。 JVM是Sles 11 sp3机器上的jdk-1.8.0_40。
我的问题是:
这似乎是应用程序在堆外大量增长的问题。可以安全地假设,还是我错过了什么?
有没有办法确定内存消耗的来源?
答案 0 :(得分:-1)
如果您使用的是Eclipse,可以尝试使用MAT(Memory Analyzer Tool)http://www.eclipse.org/mat/来确定内存消耗的来源。