Debian上的Java本地内存泄漏

我在Tomcat中部署的Java应用程序存在严重问题:

  • 操作系统:Debian 6.06(内核3.2.13-grsec-xxxx-grs-ipv6)
  • Tomcat:6.0.35
  • JDK:1.6.0_37-b06
  • JVM参数:-Xms3584m -Xmx3584m -XX:MaxPermSize = 256m -XX:ThreadStackSize = 1024
  • 线程数:200

使用几个小时后,RSS(Resident内存大小)为13GB,VSZ(虚拟内存大小)为15GB。

该应用程序有2个servlet:Spring DispatcherServlet用于一些简单的HTTP请求,而CXFServlet用于处理WebServices。 该应用程序没有任何自定义本机代码。

使用的头大约2 GB,所以这不是一个问题。

返回4 MB响应的SOAP请求会使RSS增加500 MB。 运行垃圾回收器对RSS没有影响。

你知道这个记忆增加的任何可能的原因或任何工具,可以帮助我调查这个问题。 谢谢。

pmap输出

映射:14226976K可写/私有:13772580K共享:286844K

10个最大的“anon”块:

0000000720000000 3670016 rw--- 0000000000000000 000:00000 [ anon ] 0000000000601000 2529344 rw--- 0000000000000000 000:00000 [ anon ] 0000000710000000 173504 rw--- 0000000000000000 000:00000 [ anon ] 00007f7484000000 131072 rw--- 0000000000000000 000:00000 [ anon ] 00007f7414000000 131068 rw--- 0000000000000000 000:00000 [ anon ] 00007f7424000000 131068 rw--- 0000000000000000 000:00000 [ anon ] 00007f7434000000 131068 rw--- 0000000000000000 000:00000 [ anon ] 00007f7494000000 131068 rw--- 0000000000000000 000:00000 [ anon ] 00007f737c000000 131024 rw--- 0000000000000000 000:00000 [ anon ] 00007f738c000000 131024 rw--- 0000000000000000 000:00000 [ anon ] 

使用JVisualVM(包含在Java中的分析工具)可以很好地了解JVM内部发生了什么。 手册可以在这里找到。

JVisualVM

还有其他更好的工具(JProfiler 7想到),但他们通常有许可费。 你可以试试JProfiler的免费试用版。

究竟是什么问题? 操作系统交换? 也许你只需要阅读这个问题的接受的答案: 在Linux下的Java的虚拟内存使用,使用了太多的内存

如果您使用的是NIO,那么也可能是堆外的内存消耗的来源,如下所述: 即使堆等大小稳定,为什么Sun JVM仍会继续消耗更多的RSS内存?