【问题标题】:Swap memory continuolsy increasing交换内存不断增加
【发布时间】:2014-06-14 21:26:46
【问题描述】:

我有一个在 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。

顶部还显示:

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. 如何解决这个问题?

更新:

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

【问题讨论】:

    标签: java memory glassfish swap virtual-memory


    【解决方案1】:

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

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

    由于 top 的 manpage 导致的 VIRT 空间:

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

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

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

    【讨论】:

    • 谢谢!我已经用 Jconsole 输出更新了问题。 swaoff -a 给出此错误: swapoff: /dev/mapper/VolGroup-lv_swap: swapoff failed: Cannot allocate memory。我想这是因为 RAM 没有足够的空间来容纳交换内容。
    • swapoff 给出错误:是的,您的机器似乎缺少物理内存。在这个时间范围内,您的屏幕截图上的堆内存使用情况对我来说看起来不错。 perm gen/非堆使用情况如何?
    • 根据 jconsole,两者都小于 500 mb。当我运行 vmstat 时,它显示块 io (bi/bo) 中的活动,而 si/so(swap io) 中没有变化。 io 是否可能导致交换空间使用量增加作为进程正常运行的内存?
    • 抱歉,无法说明这些细节。您是否对此进行了深入研究?
    猜你喜欢
    • 1970-01-01
    • 2014-11-13
    • 2023-03-09
    • 2021-03-10
    • 2017-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-14
    相关资源
    最近更新 更多