【发布时间】: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