它是Websphere6.1,Solaris 10,JDK 1.5.0_13上的Java Web应用程序。我们将最大堆大小设置为1024m。 jmap显示堆状态是健康的。堆内存使用率仅为57%。根本没有OutOfMemory。
但是我们从ps看到了这个java进程的非常高的RSS(3GB)。 pmap显示了一块1.9G私有内存。
3785: /dmwdkpmmkg/was/610/java/bin/java -server -Dwas.status.socket=65370 -X Address Kbytes RSS Anon Locked Pgsz Mode Mapped File ... 0020A000 2008 2008 2008 - 8K rwx-- [ heap ] 00400000 1957888 1957888 1957888 - 4M rwx-- [ heap ] 8D076000 40 40 40 - 8K rw--R [ stack tid=10786 ] ...
本机代码中是否存在C堆内存泄漏?建议采用什么方法找出根本原因?
答案 0 :(得分:4)
来自Sun的这份Troubleshooting Memory Leaks文档可以帮助您找到问题,为什么您的RSS很高,特别是在第3.4节。
在运行Websphere时,也许可以在VM上使用 -memorycheck 。有关详细信息,请参阅here。
这不一定是本机代码中的泄漏。如果查看here,则在Solaris上可能存在文件保持打开的问题。
这只是一堆链接和提示,但可能有助于追踪您的问题。
答案 1 :(得分:3)
即使没有本机内存泄漏(如未封闭的zip资源),也可能发生这种情况。
我遇到了同样的问题。这是glibc> = 2.10
的已知问题解决方法是设置此env变量
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 for MALLOC_ARENA_MAX或在SO上搜索它以查找大量参考资料。
您可能还想调整其他malloc选项以优化分配内存的低碎片:
# tune glibc memory allocation, optimize for low fragmentation
# limit the number of arenas
# requires glibc >= 2.16 since there was a bug in
# MALLOC_ARENA_TEST parameter handling that cause MALLOC_ARENA_MAX not to work
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
您可以调用本机malloc_info函数来获取有关内存分配的信息。以下是using JNA to call the native malloc_info method的示例。
答案 2 :(得分:2)
堆大小与Java堆大小相同,仍有VM和其他库是该过程的一部分。
尝试运行Hello World,其堆大小为1024m,其中包含“for(;;)”,并查看它占用了多少。这应该为您提供整体内存使用的基线。
答案 3 :(得分:1)
您使用的是JNI库吗?我不确定本机代码如何分配RAM,但这就是我开始寻找的地方。