java程序出现虚拟内存过高的问题解决

 admin   2023-05-31 15:31   176 人阅读  0 条评论

我们最近对生产系统的观察告诉我们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

本文地址:https://liuchunjie.top/?id=598
版权声明:本文为原创文章,版权归 admin 所有,欢迎分享本文,转载请保留出处!

 发表评论


表情

还没有留言,还不快点抢沙发?