Java进程在主要GC期间死掉“超出交换空间”,机器上留有足够的内存

时间:2011-06-22 19:48:20

标签: java memory garbage-collection

所以我使用VisualVM监视进程,然后单击“执行GC”,然后该进程因错误而死亡:

#
# A fatal error has been detected by the Java Runtime Environment:
#
# java.lang.OutOfMemoryError: requested 4088 bytes for char in /BUILD_AREA/jdk6_24/hotspot/src/share/vm/utilities/stack.inline.hpp. Out of swap space?
#
#  Internal Error (allocation.inline.hpp:39), pid=1148, tid=1082808672
#  Error: char in /BUILD_AREA/jdk6_24/hotspot/src/share/vm/utilities/stack.inline.hpp
#
# JRE version: 6.0_24-b07
# Java VM: Java HotSpot(TM) 64-Bit Server VM (19.1-b02 mixed mode linux-amd64 )
# An error report file with more information is saved as:
# /net/bsrs78.pit.twosigma.com/d-1/local/eaMemory2-yao-bsrs78.pit.twosigma.com-db8rsnyc9-head-20110622-130721-31729-0/hs_err_pid1148.log
#
# If you would like to submit a bug report, please visit:
#   http://java.sun.com/webapps/bugreport/crash.jsp
#

但是在我这样做之前不久,我检查了机器,似乎剩下了足够的内存(数字以MB显示):

free -m
             total       used       free     shared    buffers     cached
Mem:         96869      60999      35869          0        363       4590
-/+ buffers/cache:      56045      40823
Swap:        10243         40      10203

我似乎不太可能GC会占用所有内存。

这是一个问题,因为如果我让程序继续运行,在某些时候它将最大化其分配的堆然后尝试执行主要GC并以相同的方式死亡。小GC看起来很好。

那么这里发生了什么?为什么它会因交换空间消息而消亡?如果我能做些什么来提供更多信息或进一步诊断这个问题,请告诉我。我将非常感谢所有的帮助!

谢谢!

Edit1:我已经在http://www.mediafire.com/?kw0meup9mw5de9c上传了错误日志,并且为了它的价值,它使用PS Scavenge用于次要GC和PS MarkSweep用于主要GC。

Edit2:此外,这个问题多次发生,在一个主要的垃圾收集过程中一直死亡 - 无论是通过visualVM引起的还是由于堆耗尽而被jvm本身触发。

3 个答案:

答案 0 :(得分:0)

你看过this question/answer了吗?这似乎是VM的配置问题。

可以找到另一个例子here。通过减少分配给虚拟机的内存量来报告和修复相同的确切错误。

我无法下载您的错误日志,但我建议您尝试减少内存设置以查看是否有帮助。

答案 1 :(得分:0)

感谢大家的投入。事实证明,我们公司的系统已经对进程的虚拟内存量进行了限制(通过ulimit),这比请求的堆量高出约1G。因此,当最大限度地超出此限制时,该进程被拒绝更多内存(显然主要GC将触发此操作),即使机器上仍有更多虚拟内存(“掉线外”消息具有误导性!)。提高虚拟内存限制解决了这个问题。

答案 2 :(得分:0)

您可以看到交换空间已耗尽,并且由于OOM(OutOfMemoryError)导致崩溃 这个问题已在6月25日的JDK-6302804中得到解决 升级JVM可以避免这个问题。