当前位置: 首页 > 面试题库 >

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

郑俊彦
2023-03-14
问题内容

我们最近对生产系统的观察告诉我们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容器的常驻内存使用量正在增长。关于此问题,我们已经进行了一些调查,以了解为什么Java进程使用pmap之类的本地工具会比堆+线程堆栈+共享对象+代码缓存+等消耗更多的内存。结果,我们发现本机进程(可能是malloc / mmap)分配了一些64M内存块(成对): 我将0000000720000000 3670016K的行解释为我们使用JVM参数“

  • 问题是,那些块是什么?哪个子系统分配这些? 更新:我们不使用JIT和/或JNI本机代码调用。

  • 我使用的是Android studio 3.1.3(编写本文时的最新版本)和Gradle 3.1.3。 我不知道这是否重要,但我最近升级到了Ubuntu18.04 每当我启动Android studio时,它都是从非常小的内存占用开始的。(一个名为java的进程占用大约1GB的RAM) 还有其他人面临这个问题吗?当我在Ubuntu16.04和旧的android工作室时,这不是问题。Ubuntu一定

  • Java1.8。0_131 Windows Server 2012 R2。 “-Xmx=9000m”。但是Windows任务管理器显示java进程使用的内存超过14GB。 NMT显示“内部”消耗超过4.5 GB的内存。为什么会出现这种情况?我知道为本机内存定义空间不是Java功能。但是有什么方法可以限制“内部”内存吗? 总计:保留=15782485KB,提交=14653869KB-Java堆(保留

  • 此时可以选择时间进行redis服务器的重新启动,并且注意在rss突然降低观察是否swap被使用,以确定并非是因为swap而导致的rss降低。 一个典型的例子是:http://grokbase.com/t/gg/redis-db/14ag5n9qhv/redis-memory-fragmentation-ratio-reached-5000