我在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应用程序将停止响应。
更新
jconsole输出(记录24小时)显示堆内存和非堆内存没有增加太多。即使交换空间在同一时期内被1.5Gb削减: Jconsole output
答案 0 :(得分:0)
您可以查看these answers,以了解top输出的含义。您可以使用脚本粗略报告使用交换空间的内容。
据我所知,Linux的交换系统并不那么简单。内核首先交换非活动内存,可能是其他应用程序的内存,为GF提供足够的资源。 GF终止时不会立即换回。您可以尝试swapoff -a
强制Linux重新交换内容,但请记住通过swapon -a
重新启用它。
顶部联机帮助页面的VIRT空间:
任务使用的虚拟内存总量。它包括所有代码,数据和共享库以及已换出的页面和已映射但未使用的页面。
我怀疑操作系统报告内存使用情况是如此,以便调试您的Java应用程序。您应该使用 JVisualVM (Oracle的JDK的一部分)等工具来查看JVM的内存。观察相关时间段内存使用情况的进度。
此外,您可以尝试使用Eclipse Memory Analyzer(MAT)等工具分析堆转储。 MAT 有一些很好的报告可以帮助查找内存泄漏。如果您的应用程序的内存使用量不断增长,那么它似乎有泄漏。否则它将没有足够的可用内存。