交换内存不断增加

时间:2014-04-29 05:31:56

标签: java memory glassfish swap virtual-memory

我在RHEL中的glassfish中运行了一个Web应用程序。对于应用程序,这些设置:

Heap Memory:4GB
Perm Gen:1GB

JConsole显示:

heap memory - 500mb
non heap memory - 350mb 
threads =378

热门节目:

PID   User       PR  NI  VIRT RES  SHR S  %CPU  %MEM   TIME+   COMMAND
17948 root       20   0 12.8g 1.9g  22m S  1.5   16.0  14:09.11 java

从开始本身开始,耗费12.8G。

Top还显示:

Mem:  12251392k total, 11915584k used,   335808k free,    47104k buffers
Swap:  8322944k total,  6747456k used,  1575488k free,   177088k cached

问题是交换空间不断增加。如果没有剩余交换空间,Web应用程序将停止响应。

  1. 杀戮过程不会减少使用的交换空间,但只能在计算机重启后使用。为什么?
  2. 为什么启动过程会消耗12.8 GB的虚拟空间?
  3. 如何解决此问题?
  4. 更新

    jconsole输出(记录24小时)显示堆内存和非堆内存没有增加太多。即使交换空间在同一时期内被1.5Gb削减: Jconsole output

1 个答案:

答案 0 :(得分:0)

您可以查看these answers,以了解top输出的含义。您可以使用脚本粗略报告使用交换空间的内容。

据我所知,Linux的交换系统并不那么简单。内核首先交换非活动内存,可能是其他应用程序的内存,为GF提供足够的资源。 GF终止时不会立即换回。您可以尝试swapoff -a强制Linux重新交换内容,但请记住通过swapon -a重新启用它。

顶部联机帮助页面的VIRT空间:

  

任务使用的虚拟内存总量。它包括所有代码,数据和共享库以及已换出的页面和已映射但未使用的页面。

我怀疑操作系统报告内存使用情况是如此,以便调试您的Java应用程序。您应该使用 JVisualVM (Oracle的JDK的一部分)等工具来查看JVM的内存。观察相关时间段内存使用情况的进度。

此外,您可以尝试使用Eclipse Memory Analyzer(MAT)等工具分析堆转储。 MAT 有一些很好的报告可以帮助查找内存泄漏。如果您的应用程序的内存使用量不断增长,那么它似乎有泄漏。否则它将没有足够的可用内存。