【发布时间】:2014-11-20 09:01:45
【问题描述】:
我们最近对生产系统的观察告诉我们,Java 容器的常驻内存使用量增加了。对于这个问题,我们做了一些调查来了解,为什么java进程消耗的内存比堆+线程堆栈+共享对象+代码缓存+等要多得多,使用一些原生工具如pmap。结果,我们发现本地进程(可能使用 malloc/mmap)分配了一些 64M 内存块(成对):
0000000000400000 4K r-x-- /usr/java/jdk1.7.0_17/bin/java
0000000000600000 4K rw--- /usr/java/jdk1.7.0_17/bin/java
0000000001d39000 4108K rw--- [ anon ]
0000000710000000 96000K rw--- [ anon ]
0000000715dc0000 39104K ----- [ anon ]
00000007183f0000 127040K rw--- [ anon ]
0000000720000000 3670016K rw--- [ anon ]
00007fe930000000 62876K rw--- [ anon ]
00007fe933d67000 2660K ----- [ anon ]
00007fe934000000 20232K rw--- [ anon ]
00007fe9353c2000 45304K ----- [ anon ]
00007fe938000000 65512K rw--- [ anon ]
00007fe93bffa000 24K ----- [ anon ]
00007fe940000000 65504K rw--- [ anon ]
00007fe943ff8000 32K ----- [ anon ]
00007fe948000000 61852K rw--- [ anon ]
00007fe94bc67000 3684K ----- [ anon ]
00007fe950000000 64428K rw--- [ anon ]
00007fe953eeb000 1108K ----- [ anon ]
00007fe958000000 42748K rw--- [ anon ]
00007fe95a9bf000 22788K ----- [ anon ]
00007fe960000000 8080K rw--- [ anon ]
00007fe9607e4000 57456K ----- [ anon ]
00007fe968000000 65536K rw--- [ anon ]
00007fe970000000 22388K rw--- [ anon ]
00007fe9715dd000 43148K ----- [ anon ]
00007fe978000000 60972K rw--- [ anon ]
00007fe97bb8b000 4564K ----- [ anon ]
00007fe980000000 65528K rw--- [ anon ]
00007fe983ffe000 8K ----- [ anon ]
00007fe988000000 14080K rw--- [ anon ]
00007fe988dc0000 51456K ----- [ anon ]
00007fe98c000000 12076K rw--- [ anon ]
00007fe98cbcb000 53460K ----- [ anon ]
我解释 0000000720000000 的行 3670016K 是指堆空间,我们使用 JVM 参数“-Xmx”定义其大小。在那之后,对开始,其中总和正好是 64M。 我们使用的是 CentOS release 5.10 (Final) 64-bit arch 和 JDK 1.7.0_17 。
问题是,这些块是什么?哪个子系统分配这些?
更新:我们不使用 JIT 和/或 JNI 本机代码调用。
【问题讨论】:
-
您是否使用 VisualVM 或类似工具分析过您的 java 应用程序?
-
使用VisualVM,只能在堆空间内进行监控。