Java Process的居民内存使用量(RSS)不断增长

我们最近对生产系统的观察告诉我们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版本5.10(最终版)64位arch和JDK 1.7.0_17。

问题是,这些障碍是什么?哪个子系统分配这些资源?

更新:我们不使用JIT和/或JNI本机代码调用。

回答:

我遇到了同样的问题。这是glibc> = 2.10的已知问题

解决方法是设置这个环境变量

export MALLOC_ARENA_MAX=4

IBM有关设置MALLOC_ARENA_MAX的文章 https://www.ibm.com/developerworks/community/blogs/kevgrig/entry/linux_glibc_2_10_rhel_6_malloc_may_show_excessive_virtual_memory_usage?lang=en

在Google上搜索MALLOC_ARENA_MAX或在SO上搜索它以找到大量参考。

你可能还需要调整其他malloc选项以优化分配的内存的低碎片:

# tune glibc memory allocation, optimize for low fragmentation

# limit the number of arenas

export MALLOC_ARENA_MAX=2

# disable dynamic mmap threshold, see M_MMAP_THRESHOLD in "man mallopt"

export MALLOC_MMAP_THRESHOLD_=131072

export MALLOC_TRIM_THRESHOLD_=131072

export MALLOC_TOP_PAD_=131072

export MALLOC_MMAP_MAX_=65536

以上是 Java Process的居民内存使用量(RSS)不断增长 的全部内容, 来源链接: utcz.com/qa/432888.html

回到顶部