我们最近对生产系统的观察告诉我们Java容器的常驻内存使用量正在增长。 关于此问题,我们已经进行了一些调查,以了解为什么Java进程使用pmap之类的本地工具会比堆+线程堆栈+共享对象+代码缓存+等消耗更多的内存。 结果,我们发现本机进程(可能是malloc / mmap)分配了一些64M内存块(成对):
这就是我们解决问题的方式。 感谢您的回复。
Java 8中有一个JVM错误,这会导致无限制的本机内存增长:bugs.java.com/bugdatabase/view_bug.do?bug_id=JDK-8164293-如果这对您有影响,则使用MALLOC_ARENA_MAX可能会减慢您的内存增长 ,但不能完全解决问题。
另一个JVM"错误" bugs.openjdk.java.net/browse/JDK-8193521
检查以下答案:stackoverflow.com/a/35610063,它具有有关Java本机内存泄漏的更多详细信息。
BM关于设置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选项以优化分配的内存的低碎片:
1 2 3 4 5 6 7 8 | # 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 |
或者sysctl -m export MALLOC_ARENA_MAX=4
发表评论