java - 交换内存不断增加

标签 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。

顶部还显示:

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

最佳答案

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

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

由于 top 的联机帮助页而产生的 VIRT 空间:

The total amount of virtual memory used by the task. It includes all code, data and shared libraries plus pages that have been swapped out and pages that have been mapped but not used.

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

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

关于java - 交换内存不断增加,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23356235/

相关文章:

java - Android 上的底部导航 - 内容隐藏

c# - 托管环境中使用的最大堆? (.net/java)

java - Glassfish v4 和 SSL - 管理员不再工作

java - saaj.soap 到 xml.soap 在 Glassfish 中抛出异常

java - Spring MVC中如何浏览htm文件

java - 如何从字符串的开头删除括号中的文本

java - struts2 spring项目运行在jetty和tomcat上

java - 哪个java集合允许重复键

linux - 什么是私有(private)页面?

c - 微型内存管理器