我有一个网络应用程序运行在玻璃鱼在RHEL。对于应用程序,这些设置如下:
Heap Memory:4GB
Perm Gen:1GBJConsole显示:
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应用程序将停止响应。
更新:
J控制台输出(记录了24小时)显示堆内存和非堆内存并没有增加多少。即使交换空间在同一时期内被修改了1.5Gb:J控制台输出
发布于 2014-04-29 07:01:00
您可以看看这些答案,以了解top的输出的含义。您可以使用脚本大致报告什么使用您的交换空间。
据我所知,Linux的交换系统并不是那么简单。内核首先交换不活动内存(可能是其他应用程序的内存),以便为GF提供足够的资源。当GF被终止时,这将不会立即被交换回来。您可以尝试使用swapoff -a来迫使Linux重新交换内容,但请记住通过swapon -a重新启用它。
VIRT空间,由于顶部的管理:
任务使用的虚拟内存总量。它包括所有代码、数据和共享库,以及已换出的页和已映射但未使用的页。
我怀疑OS关于内存使用情况的报告对于调试Java应用程序是否有那么好的效果。您应该使用JVisualVM (Oracle的JDK的一部分)等工具查看JVM的内存。观察一段时间内记忆使用的进展。
此外,您可以尝试使用像日食内存分析器 (MAT)这样的工具来分析堆转储。MAT有一些不错的报告,可以帮助查找内存泄漏。如果您的应用程序的内存使用量不断增加,它似乎存在漏洞。否则,它将仅仅没有足够的内存可用。
https://stackoverflow.com/questions/23356235
复制相似问题