jvm运行中出现的致命问题“Out of swap space”

pork 2008-07-24 11:03:03
Tomcat5.5运行在win2003 server平台上,近期频繁出现tomcat意外当机现象,在hs_err_pidxxxx.log文件中,记录的都是因为Out of swap space现象导致的,下面是最近一次文件记录中的头信息部分及Heap使用的内容:

#
# An unexpected error has been detected by Java Runtime Environment:
#
# java.lang.OutOfMemoryError: requested 48798720 bytes for jbyte in C:\BUILD_AREA\jdk6_02\hotspot\src\share\vm\prims\jni.cpp. Out of swap space?
#
# Internal Error (414C4C4F434154494F4E0E494E4C494E450E4850500017), pid=1428, tid=2492
#
# Java VM: Java HotSpot(TM) Client VM (1.6.0_02-b06 mixed mode)
# If you would like to submit a bug report, please visit:
# http://java.sun.com/webapps/bugreport/crash.jsp
#

Heap
def new generation total 72576K, used 54639K [0x02d70000, 0x07c30000, 0x07c30000)
eden space 64512K, 74% used [0x02d70000, 0x05c729e8, 0x06c70000)
from space 8064K, 80% used [0x07450000, 0x07aa9448, 0x07c30000)
to space 8064K, 0% used [0x06c70000, 0x06c70000, 0x07450000)
tenured generation total 967936K, used 781190K [0x07c30000, 0x42d70000, 0x42d70000)
the space 967936K, 80% used [0x07c30000, 0x37711bb8, 0x37711c00, 0x42d70000)
compacting perm gen total 40704K, used 40572K [0x42d70000, 0x45530000, 0x62d70000)
the space 40704K, 99% used [0x42d70000, 0x4550f340, 0x4550f400, 0x45530000)
No shared spaces configured.

用jconsole看了事发前后的vm摘要,交换空间总量为4G,可用交换空间为3G左右,没有大的变化。
想请问各位,这里的提到的swap space是不是就是指的是交换空间,它的设置是不是指设定的虚拟内存空间(我在机器的c盘设置了4G,且该盘有足够的剩余空间),如不是的话,该如何设置以解决out of swap space现象。另外在Heap信息中给出的No shared spaces configured这里又有什么提示,是不是跟问题的现象也有什么关系,拜托各位能提供些有用的信息了!
...全文
4603 45 打赏 收藏 转发到动态 举报
写回复
用AI写文章
45 条回复
切换为时间正序
请发表友善的回复…
发表回复
candy890419 2011-05-30
  • 打赏
  • 举报
回复
我也碰到了ls的问题,ls是怎么解决的呢?期待指点
zhuran_lili 2010-07-27
  • 打赏
  • 举报
回复
# A fatal error has been detected by the Java Runtime Environment:
#
# java.lang.OutOfMemoryError: requested 511248 bytes for Chunk::new. Out of swap space?
#
# Internal Error (allocation.cpp:215), pid=4480, tid=1867205520
# Error: Chunk::new
#
# JRE version: 6.0_14-b08
# Java VM: Java HotSpot(TM) Server VM (14.0-b16 mixed mode linux-x86 )
# If you would like to submit a bug report, please visit:
# http://java.sun.com/webapps/bugreport/crash.jsp
#
ybm 2010-04-07
  • 打赏
  • 举报
回复
我也遇到这个问题,查了很久,没有解决
JavaAlpha 2009-08-28
  • 打赏
  • 举报
回复
你后来是如何解决的
langke93 2009-05-15
  • 打赏
  • 举报
回复
#
# An unexpected error has been detected by HotSpot Virtual Machine:
#
# SIGSEGV (0xb) at pc=0x004f0de6, pid=32674, tid=1044749232
#
# Java VM: Java HotSpot(TM) Server VM (1.5.0_08-b03 mixed mode)
# Problematic frame:
# C [libc.so.6+0x68de6] strcpy+0x26
#
# An error report file with more information is saved as hs_err_pid32674.log
!>_<
foamflower 2009-04-14
  • 打赏
  • 举报
回复
我今天也出现了这个问题:
#
# An unexpected error has been detected by Java Runtime Environment:
#
# java.lang.OutOfMemoryError: requested 1024000 bytes for GrET in C:\BUILD_AREA\jdk6_05\hotspot\src\share\vm\utilities\growableArray.cpp. Out of swap space?
#
# Internal Error (allocation.inline.hpp:42), pid=18232, tid=14500
# Error: GrET in C:\BUILD_AREA\jdk6_05\hotspot\src\share\vm\utilities\growableArray.cpp
请问你后来是如何解决的?
pork 2008-08-19
  • 打赏
  • 举报
回复
谢谢maquan详细的解释,我会对这方面的信息做出查证。若有不明之处仍望指教!
maquan 2008-08-09
  • 打赏
  • 举报
回复
要找到我说的那些文件,你首先要下载一套 Sun JDK 的源代码。(现在 Sun 的 JDK 已经开源了,不过即使以前没有开源的时候,也可以通过 SCSL 得到全部的源代码)

那个图像处理程序你们自己掌握源代码吗?如果掌握的话,可以查一下 native code 部分是否有通过 jni_GetByteArrayElements() 申请大块内存的情况,适当优化一下(比如考虑可否用小块内存完成任务、利用文件缓存等等);

如果不掌握源代码的话,就只能从 Java 这边想办法了。前面我说过,作为一个单独的系统应用,申请 48M 内存并不算太过分的事情,你这里出现这个问题,十有八九是在 web 应用环境下并发访问造成的。所以要看看你的 web 应用这边,是怎么调用图像处理程序的,如果有大量并发的可能,就想办法做成串行处理的,或者至少搞个线程池来限制并发个数。

错误信息中的那个字节数,应该是 native code 在辗转调用 AllocateHeap() 时申请的字节数。至于 AllocateHeap(),按我目前的理解(这次没有专门去查文档,不敢十分确定),应该是受 Windows 进程的额度限制(注意,是 Windows 系统提供给 JVM 进程的额度,而不是 JVM 提供给 Java 程序的额度,所以 -Xmx 之类的参数对此问题应该没有影响),而事实上这个额度限制就是整个操作系统的可用内存。

如果要应急解决问题的话,可以考虑增大物理内存。不过,如果机制方面存在问题的话,多大的内存都有用爆的时候。
shili150 2008-08-07
  • 打赏
  • 举报
回复

如果是在eclipse 运行,可以在 选项里面设置 jvm堆的大小


如果在dos下运行的 话

不妨这样 java -Xmx256M -Xms256M XXXX.jar
愤怒的小蒋 2008-08-07
  • 打赏
  • 举报
回复
注意别加太大
maquan 2008-08-07
  • 打赏
  • 举报
回复
另外,AllocateHeap() 应该是不受 -Xmx 额度限制的,所以设置 JVM 的启动参数应该于事无补。

既然 AllocateHeap() 是在“整个系统的可用内存”中进行分配,那么 48M 按说也不是什么太过分的要求,但是,在你的 Web 运行环境下,很可能会出现多任务并发,这个就不好说了。
maquan 2008-08-07
  • 打赏
  • 举报
回复
"Out of swap space" 只是内存不足时的一个提示,并不一定是什么“交换空间”。

我在 JDK 的源代码里查了一下(我用的是 jdk-1_5_0-src-scsl,跟你的 6_02 不太一样,仅供参考吧),在 jdk-1_5_0-src-scsl\hotspot\src\share\vm\runtime\java.cpp 这个文件里找到了输出“java.lang.OutOfMemoryError: requested ... Out of swap space?”那段程序,就是 vm_exit_out_of_memory(),在整个hotspot 里,直接调用 vm_exit_out_of_memory() 的地方并不多,其中只有两处能产生你看到的输出,就是 jdk-1_5_0-src-scsl\hotspot\src\share\vm\memory\allocation.inline.hpp 里面的 AllocateHeap() 和 ReallocateHeap(),继续追查下去,发现在 jdk-1_5_0-src-scsl\hotspot\src\share\vm\memory\allocation.hpp 中定义的宏 NEW_C_HEAP_ARRAY 和 REALLOC_C_HEAP_ARRAY 恰好能产生你看到的那种格式的输出(“jbyte in C:\BUILD_AREA\jdk6_02\hotspot\src\share\vm\prims\jni.cpp”),而在 jni.cpp 中只有两处调用了 NEW_C_HEAP_ARRAY,其中只有一处可能是“jbyte”,这段代码(“jni_GetByteArrayElements()”)应该是供 JNI 的 native code 调用的。

所以,我觉得最大的可能是,你的“处理图像”的程序有一部分是用 JNI 实现的,而 native code 部分由于处理不当,在某种情况下就试图申请 48M 的内存空间,而且是通过 jni_GetByteArrayElements() 调用的,此时 AllocateHeap() 已经无法满足请求,就通过 vm_exit_out_of_memory() 报告了这个错误,这就是你看到的错误报告。
pork 2008-08-07
  • 打赏
  • 举报
回复
谢谢大家热心的回答!
按照maquan的分析,先头对swap space的理解可能方向偏离了,请问maquan,在1.6.0下,我应该在何处找到你所分析的文件呢(如java.cpp,allocation.hpp等)?
再者,日志中出现的java.lang.OutOfMemoryError: requested 48798720(194400000这个数值在这两天出现了7、8次) bytes ......,你认为这样的请求是线程的原始请求内存大小,还是native化处理后请求的内存?你谈到的“AllocateHeap() 已经无法满足请求”,请问这里面有没有什么限制,谢谢!
pork 2008-08-06
  • 打赏
  • 举报
回复
昨天晚上又因为该事件当了3次服务,只有重启操作系统才得以缓解,大家都未曾见过该现象么?
pork 2008-08-06
  • 打赏
  • 举报
回复
应用是用来做处理图像的,所以大的请求是存在的,奇怪的就是为什么交换空间总是不够,这才是关键
maquan 2008-08-06
  • 打赏
  • 举报
回复
[Quote=引用楼主 pork 的帖子:]
# java.lang.OutOfMemoryError: requested 48798720 bytes for jbyte in C:\BUILD_AREA\jdk6_02\hotspot\src\share\vm\prims\jni.cpp. Out of swap space? [/Quote]

难道是一次申请 48M 内存?如果真是这样的话,恐怕是程序的处理逻辑设计得有问题……
pork 2008-08-05
  • 打赏
  • 举报
回复
刚才在17:30重启的tomcat,18:10就出现了该现象,到底这个swap space应该如何设置才能解决?
pork 2008-08-04
  • 打赏
  • 举报
回复
最后再等等有没有知情者,谢谢了!
胡矣 2008-08-04
  • 打赏
  • 举报
回复
还真不懂 帮你顶了
pork 2008-07-31
  • 打赏
  • 举报
回复
服务器的内存为2G,Xmx为1G,虚拟内存为4G
加载更多回复(24)

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧