【问题标题】:swap out of memory换出内存
【发布时间】:2012-03-10 10:11:13
【问题描述】:

我正在开发 java 应用程序,我在 VM 选项中设置了以下配置

  • -Xms 和 -Xmx 选项设置为 1024m
  • -XX:MaxPermSize=128m 硬件:32 位 Windows 7 系统,2GB 内存。

我经常遇到 java out of swap space 错误。可能是什么原因?请帮帮我。

【问题讨论】:

  • 堆栈分配? Numpy数组分配?尝试一些调试打印...没有代码(而且我知道您可能无法发布所有代码)并非不可能说
  • 机器上还有什么正在运行,实际的交换空间设置为多少? (计算机->系统属性->高级系统设置->性能设置->高级选项卡,查看虚拟内存下的设置是什么)
  • 你需要-Xms-Xmx这么高吗?
  • 我需要 -Xms 和 -Xmx 1024m 因为应用程序用于需要大量内存的图像和视频处理

标签: java


【解决方案1】:

原因是您的操作系统没有为您正在运行的作业组合配置足够的交换空间。交换空间是磁盘上的一个区域,当虚拟内存页多于物理内存页时,操作系统会在其中放置内存页副本。

所以发生的情况是,您的 JVM 要求的虚拟内存比操作系统所能提供的更多。

(更新为包括彼得的 cmets)

一些可能的修复:

  • 假设硬件和操作系统允许添加更多物理内存。 (在这种情况下,操作系统应该允许它的答案......)

  • 为系统配置更多交换空间。

  • 杀死机器上运行的其他一些非必要的应用程序和服务。

  • 更改 Java 应用程序的 JVM 选项以减小堆大小。

【讨论】:

  • +1:添加更多交换空间,或在机器上运行更少的其他应用程序。如果您将 1024M 用于堆,128M perm gen 和大约 150 MB 共享库等用于 Java,而将 512M 用于操作系统,则不会为其他所有内容留下太多内存。如果可以的话,也许是时候更新内存了。 16 GB 的成本可能不到 100 英镑。 ;)
【解决方案2】:

“Hotspot VM”下的Java release notes 说明了这个确切的错误;

如果您看到此症状,请考虑增加可用交换空间 通过为虚拟内存分配更多磁盘和/或通过限制 您同时运行的应用程序的数量。你也可以 通过减少 -Xmx 标志的值来减少内存的使用, 这限制了 Java 对象堆的大小​​。

换句话说,您的机器正在做太多其他事情,耗尽了内存,无法提供您告诉 Java VM 它应该能够使用的 1GB。

【讨论】:

  • +1。我们已经监视了一段时间的重复故障模式,故障时间帮助我们发现了由 Spring Quartz 调度程序管理的几个日常报告作业,作为我们的 tomcat 应用程序的一部分。 JVM ms/mx 选项为 4G,很高,但只分配了 2 个交换空间。解决了这两个问题后,故障就再也不会出现了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-09-18
  • 1970-01-01
  • 1970-01-01
  • 2012-06-30
  • 2014-07-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多