【问题标题】:Java OutOfMemoryError due to Linux RAM disk cache not freed由于 Linux RAM 磁盘缓存未释放而导致的 Java OutOfMemoryError
【发布时间】:2010-05-21 13:48:46
【问题描述】:

该过程将运行一整天,然后,bam,没有警告,它会抛出这个错误。有时似乎在无所事事。它会在一天中看似随机的时间发生。我检查了机器上是否正在运行其他任何东西,例如计划备份或其他东西,但什么也没找到。机器有足够的物理内存(2GB,大约有 1GB 的空闲空间用于 3-500MB 的负载),并且指定了足够的 -Xmx。

根据我们的系统管理员的说法,问题是当 JVM 需要分配内存时,内核用作磁盘缓存的 RAM(显然只有 8MB)没有被释放,因此 JVM 进程抛出了 OutOfMemoryError。这可能是因为Java在分配前询问内核是否有足够的内存可用,发现内存不足,导致崩溃。

然而,我想 Java 只是尝试通过内核分配内存,当内核收到这样的请求时,它会通过抛出我们的一些磁盘缓存来为应用程序腾出空间。

有没有其他人遇到过这个问题,如果有,错误是什么,您是如何解决的? 我们目前在 VMWare ESX 中的 SLES 10 SP2 Linux 2.6.16.60-0.42.9-smp 上使用 jdk1.6.0_20。

【问题讨论】:

  • 你分配了巨大的内存块吗?比如,一个 100 MB 的 long[] 数组?然后我不确定,但是您可以尝试将使用的最小内存量修复为与最大值相同,仅用于测试:-Xms1500M -Xmx1500m 这可以为您的系统管理员提供一些实验的食物.
  • 不是那样的,不。我处理 XML 消息并读取和写入数据库。很简单的东西。 XML 消息很少超过几 KB。
  • 你有运气解决这个问题吗?我有一个数组,显示每个节点都有大约 20GB 的缓存内存,但 java 服务不断因堆问题而崩溃。
  • 不。直到今天它仍然是一个谜......

标签: java linux memory linux-kernel


【解决方案1】:

根据我们的系统管理员的说法,问题是当 JVM 需要分配内存时,内核用作磁盘缓存的 RAM(显然只有 8MB)没有被释放,因此 JVM 进程抛出了 OutOfMemoryError。

我认为您的系统管理员弄错了。 Linux 将根据系统对运行进程的物理内存需求,自动透明地增加和缩小缓冲区缓存的大小。如果不是,则说明您的操作系统存在严重问题。

您的 Java 应用程序更有可能存在内存泄漏,导致它使用的堆空间量稳步增加。最终,您违反了 -Xmx 限制并获得了 OOME。我将通过运行启用了 GC 日志记录的应用程序来开始对此进行调查。这将告诉您堆如何随时间增长、GC 回收了多少空间等等。

另一种可能是您没有配置足够的交换空间。

【讨论】:

  • 我确实有 2GB 的交换空间,但 java 拒绝碰它。当我用完物理内存时,即使没有使用交换,java 也会抛出 OOME。我也不认为是内核磁盘缓存是罪魁祸首,但我认为我应该提供到目前为止我得到的所有信息。
  • 我认为你应该在 ServerFault 上问这个问题。听起来它可能是某种 VMware 配置的东西。 (也许您的虚拟机不知道它有交换盘?您需要在虚拟机启动时拨打swapon 或其他什么吗?)
【解决方案2】:

你知道抛出异常时java分配了多少内存吗?问题可能是 Java 已经使用了 -Xmx 指定的所有内存。 (请记住,-Mmx 给出了允许的最大内存使用量,因此如果它的使用量增长到指定大小以上,java 将抛出 OutOfMemmoryException,即使 linux 内核能够为其提供更多内存)。

但要确定是否是这种情况,请尝试给它一个等于 -Xms 指定大小的 -Xms。 (-Ms 设置初始大小,java 应该低于这个,所以它会在启动时分配所有需要的内存)。

如果 java 仍然启动,并且仍然给你 OutOfMemoryException 那么问题很可能是你的 -Mx 太小了。

ps:我很确定普通的 linux 内核不会因为内核过度使用而导致内存分配失败,所以如果你真的用尽了整个系统的内存,你会遇到页面错误(并且oom 杀手,会杀死一个任务)而不是 java 异常。但是java可能会使用一些特殊功能来分配内存,所以我不确定这是否适用于此。

【讨论】:

    猜你喜欢
    • 2012-12-27
    • 1970-01-01
    • 1970-01-01
    • 2015-06-21
    • 1970-01-01
    • 1970-01-01
    • 2012-07-05
    • 1970-01-01
    • 2013-03-25
    相关资源
    最近更新 更多