使用-Xmx1024m的Java进程如何占用3GB驻留内存?

时间:2009-03-26 15:59:34

标签: java memory-leaks

它是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堆内存泄漏?建议采用什么方法找出根本原因?

4 个答案:

答案 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,但这就是我开始寻找的地方。