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这里又有什么提示,是不是跟问题的现象也有什么关系,拜托各位能提供些有用的信息了!

解决方案 »

  1.   

    此回复为自动发出,仅用于显示而已,并无任何其他特殊作用
    楼主【pork】截止到2008-07-24 11:03:10的历史汇总数据(不包括此帖):
    发帖的总数量:11                       发帖的总分数:440                      每贴平均分数:40                       
    回帖的总数量:13                       得分贴总数量:1                        回帖的得分率:7%                       
    结贴的总数量:11                       结贴的总分数:440                      
    无满意结贴数:3                        无满意结贴分:150                      
    未结的帖子数:0                        未结的总分数:0                        
    结贴的百分比:100.00%               结分的百分比:100.00%                  
    无满意结贴率:27.27 %               无满意结分率:34.09 %                  
    敬礼!
      

  2.   

    不是什么WEB服务器,就是自己写的一个爬虫程序,用Jprofiler检测貌似没有内存泄露,我设置的参数是-Xms256m -Xmx256m 
    WINDOWS VISTA操作系统,内存2G,用的MyEclipse6.0 # An unexpected error has been detected by Java Runtime Environment: 

    # java.lang.OutOfMemoryError: requested 41943040 bytes for GrET in C:\BUILD_AREA\jdk6\hotspot\src\share\vm\utilities\growableArray.cpp. Out of swap space? 

    #  Internal Error (414C4C4F434154494F4E0E494E4C494E450E4850500017), pid=4472, tid=4848 

    # Java VM: Java HotSpot(TM) Client VM (1.6.0-rc-b66 mixed mode) 
    # An error report file with more information is saved as hs_err_pid4472.log 

    # If you would like to submit a bug report, please visit: 
    #  http://java.sun.com/webapps/bugreport/crash.jsp 

     
     
     
    问题点数:50 回复次数:6 显示所有回复显示星级回复显示楼主回复 修改 删除 举报 引用 回复   
      加为好友 
    发送私信 
    在线聊天
     healer_kx 
    甘草 
    等级:
     发表于:2008-03-11 13:42:321楼 得分:13 
    好像是说pagefile.sys这个文件都不够的意思了,你这个哪是内存不够了,估计是连硬盘都不够了。多大的数据量啊? 
     
     
    修改 删除 举报 引用 回复   
     
     加为好友 
    发送私信 
    在线聊天
     Aniao 
    阿鸟 
    等级:
     发表于:2008-03-11 14:38:512楼 得分:0 
    .....我怎么没有看到pagefile.sys这几个字,我的Eclipse和jre和jvm所在的E盘的剩余空间还有5个G呢.... 
     
    修改 删除 举报 引用 回复   
     
     加为好友 
    发送私信 
    在线聊天
     nihuajie05 
    陆烨辰 
    等级:
     发表于:2008-03-11 15:33:453楼 得分:13 
    没有遇到过 
    不过同LS,问甘草哪来的pagefile.sys字段 
     
    修改 删除 举报 引用 回复   
     
     加为好友 
    发送私信 
    在线聊天
     healer_kx 
    甘草 
    等级:
     发表于:2008-03-11 15:34:594楼 得分:0 
    是Windows上的虚拟内存啊,就是Linux所谓的交换分区。 
     
    修改 删除 举报 引用 回复   
     
     加为好友 
    发送私信 
    在线聊天
     java2000_net 
    老紫竹   失业中....     有合适的北京天津工作联系我 
    等级:
     发表于:2008-03-12 06:49:545楼 得分:12 
    恩! 先调整一下机器的虚拟内存看看吧! 
    在我的电脑,右键,属性,高级里面吧! 看看你的虚拟内存是不是太少了! 还有,你可以启动jconsole监控一下你的程序的内存使用情况,这个工具是JDK自带的。 
     
     
    修改 删除 举报 引用 回复   
     
     加为好友 
    发送私信 
    在线聊天
     bobor_2008 
    @_@ 
    等级:
     发表于:2008-03-12 14:35:576楼 得分:12 
    你用的是Eclipse开发的吧. 我估计是Eclipse的漏洞,我在作项目的时候也多次遇到这种问题(我的的内存和虚拟内存都可以). 我的解决方法是,保存所编辑的文件. 
    重启Eclipse,此方法自感笨拙,但也没有找出更好的方法. 
     
     
      

  3.   

    楼上提供的csdn的帖子以及其它的一些信息我都有所了解,发帖前的基础准备工作还是要尽可能做全的。
    请提供有价值的信息,谢谢!
      

  4.   

    我之前做的一个项目也出现OutOfMemoryError 异常,后来增加tomcat 运行的jvm的内存就没有这个问题了.
    解决方法:
    windows 更改系统环境变量
    加上JAVA_OPTS=-Xms64m -Xmx512m
    Linux  在{tomcat_home}/bin/catalina.sh的前面,加 
    set JAVA_OPTS='-Xms64 -Xmx512' 我的是linux系统所以用了第二种方法.如果你的是windows系统除了修改环境变量外,应该也可以修改catalina.bat 加上JAVA_OPTS=-Xms64m -Xmx512m
    也可以启动config tomcat程序,在配置窗口中打开java标签页,下面有Initial memory pool 及 max memory pool 等选项,你把值调得足够大,应该就OK了.最后,如果是elcipse开发环境下有这个问题,也可以设置eclipse下tomcat的运行参数
      

  5.   

    我没有你的环境,无法搭建环境模拟;我的猜测:猜测:设置的参数是-Xms256m -Xmx256m  
         ----swap不足的时候,unix下系统内存分配会失败,但是如果你上面确定swap设置并且运行时候是OK的,这个应该不成立。所以还有一个可能就是你的tomcat/eclipse启动时候限制了堆的大小,如果大于256M,就申请不到内存了。如果先前没有指定,JAVA会有一个缺省的,多少我忘记了,反正是不大(好像是64吧),所以我认为和你的SWAP的设置没有关系。用jconsole看了事发前后的vm摘要,交换空间总量为4G,可用交换空间为3G左右,没有大的变化。
    想请问各位,这里的提到的swap space是不是就是指的是交换空间,它的设置是不是指设定的虚拟内存空间(我在机器的c盘设置了4G,且该盘有足够的剩余空间),
         ----是的。windows下就是虚拟内存;unix是交换区。如不是的话,该如何设置以解决out of swap space现象。另外在Heap信息中给出的No shared spaces configured这里又有什么提示,是不是跟问题的现象也有什么关系,拜托各位能提供些有用的信息了!
         ----您看看程序启动时候哪里可以设置xmx,设置大一点。
         ----No shared spaces configured 是JVM里面的一个函数打出来的,我贴出来你看看:
      void CompactingPermGenGen::print_on(outputStream* st) const {
      OneContigSpaceCardGeneration::print_on(st);
      if (spec()->enable_shared_spaces()) {
        st->print("    ro");
        ro_space()->print_on(st);
        st->print("    rw");
        rw_space()->print_on(st);
      } else {
        st->print_cr("No shared spaces configured.");   ----就是这里,在内存分配失败后打印的,这里没有太大指导意义。
      }
    }
      

  6.   

    默认情况下,tomcat运行jvm的最大内存好象是128M,我的情况是,当多用户同时执行操作时,就会出现OutOfMemoryError,似乎是jvm内存不够用引起的,后来加大内存就没事了.
      

  7.   

    我在linux下应该加了这句 export JAVA_OPTS="-Xms256m -Xmx512m"  //我用了export 而不是set
      

  8.   

    tomcat的-Xms,-Xmx以及permSize我都有设置,应该不是这个问题,因为我的应用主要是用来处理图像服务,所以内存消耗较大,曾针对heap的out of memory,做过相应的处理,所以我描述的swap space现象是怎么回事,出现的比较频繁
      

  9.   

    我也是在win2003下部署tomcat,遇到的问题也不少,但是没遇到你这样的问题。
    我给系统盘(otmcat也在这下面)分了15G空间
      

  10.   

    还有一种可能,先前我遇到的,就是GC的线程优先级别低,还有就是image的内存占用太多,如果比较频繁的时候,虽然机器还有内存,还是GC回收不过来,一样会出现内存不够的问题。解决办法:运行时候,你看一下CPU和内存增长的情况,如果CPU过高,或内存增长、降低频率、幅度都比较大的话,就有这个可能。
    还有一个就是参考一下JDK的开源实现,我记得先前研究的时候,image的处理使用了弱引用类,可以降低此类问题出现的频率。
      

  11.   

    请问C0001:
    如果真是GC线程优先级执行的问题,导致GC无法正常回收,你认为最可能的原因是什么;针对处理image的应用,应该如何保证GC的有效运行(不能太频繁而影响性能)?
    另外在处理image时cpu和memory的变化幅度确实很大,你提到的image的弱引用类,可否做出进一步描述?
    谢谢!此外还想了解一下,作为swap space,它在什么情况下会与内存的Heap space用何方式进行交互的,交互的关系何结果又如何?
    谢谢!
      

  12.   

    你确认你设置得足够大,并且已经生效了吗?  如果内存太小,而你的应该刚好大量内存,即使gc回收了,但还是不够用的情况也会出现的,这时就会有OutOfMemoryError 错误了.
      

  13.   

    如果是Heap的out of memory,那不是我现在这里向大家请教的问题;至于设置有没有生效,在tomcat的manager中可以看到相关情况。
    现在主要想了解我在上面提到的问题,谢谢!
      

  14.   

    请问C0001: 
    如果真是GC线程优先级执行的问题,导致GC无法正常回收,你认为最可能的原因是什么;针对处理image的应用,应该如何保证GC的有效运行(不能太频繁而影响性能)? 
    另外在处理image时cpu和memory的变化幅度确实很大,你提到的image的弱引用类,可否做出进一步描述? 
    谢谢! 
      ---我本地的环境已经没有了;以前遇到过;当时的问题现象就是outofmemory;定位缺陷的时候,发现内存是够的,硬盘也是够的;最后定位出来是对象的new和销毁太频繁了;原因就是GC在系统繁忙的时候,GC不过来,瞬时间导致问题出现.
      ---解决的办法很简单(定位过程比较难,绕了很多弯),就是把对象尽量重用,而不是delete(JAVA里面没有这个东东,我的意思你明白就可以了),避免太频繁的创建和销毁对象.
      ---image的处理方式我建议你首先按照我上面说的思路试试,然后再研究一下WeakReference,他在JDK的源代码有使用的.但是这个问题的解决是否有帮助难说.建议你上网查查这块的资料,然后再看看JDK的源代码,都有说明.
    此外还想了解一下,作为swap space,它在什么情况下会与内存的Heap space用何方式进行交互的,交互的关系何结果又如何? 
    谢谢!
      --unix有单独的命令把swap额外增加到一个文件中,如果内存不够的时候,就会使用这个额外的毕竟这个东东在硬盘上,是虚拟的;和OS本身的MMU是本质的区别.具体交互的过程和细节我没有研究过,你可以找一下这方面的材料 http://baike.baidu.com/view/418446.htm 
      

  15.   

    谢谢C0001的回复!
    对你谈到的前部分内容,我表示赞同,因为做的是图片处理的应用,在这些方面都有重视,特别是频繁的GC带来的性能问题也都有注意,另外你谈到的弱引用我也会去做进一步的了解。
    我想在这方面的改进优化是不断进行的,但效果也不是能立刻观察到的,jvm频频出现C:\BUILD_AREA\jdk6_02\hotspot\src\share\vm\prims\jni.cpp. Out of swap space现象,可有哪位具体见过,可有其它解决之道,尽快恢复服务正常运行
      

  16.   

    服务器的内存为2G,Xmx为1G,虚拟内存为4G
      

  17.   

    刚才在17:30重启的tomcat,18:10就出现了该现象,到底这个swap space应该如何设置才能解决?
      

  18.   

    "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() 报告了这个错误,这就是你看到的错误报告。
      

  19.   

    另外,AllocateHeap() 应该是不受 -Xmx 额度限制的,所以设置 JVM 的启动参数应该于事无补。既然 AllocateHeap() 是在“整个系统的可用内存”中进行分配,那么 48M 按说也不是什么太过分的要求,但是,在你的 Web 运行环境下,很可能会出现多任务并发,这个就不好说了。
      

  20.   


    如果是在eclipse 运行,可以在 选项里面设置 jvm堆的大小
    如果在dos下运行的 话不妨这样 java -Xmx256M -Xms256M XXXX.jar
      

  21.   

    谢谢大家热心的回答!
    按照maquan的分析,先头对swap space的理解可能方向偏离了,请问maquan,在1.6.0下,我应该在何处找到你所分析的文件呢(如java.cpp,allocation.hpp等)?
    再者,日志中出现的java.lang.OutOfMemoryError: requested 48798720(194400000这个数值在这两天出现了7、8次) bytes ......,你认为这样的请求是线程的原始请求内存大小,还是native化处理后请求的内存?你谈到的“AllocateHeap() 已经无法满足请求”,请问这里面有没有什么限制,谢谢!
      

  22.   

    要找到我说的那些文件,你首先要下载一套 Sun JDK 的源代码。(现在 Sun 的 JDK 已经开源了,不过即使以前没有开源的时候,也可以通过 SCSL 得到全部的源代码)那个图像处理程序你们自己掌握源代码吗?如果掌握的话,可以查一下 native code 部分是否有通过 jni_GetByteArrayElements() 申请大块内存的情况,适当优化一下(比如考虑可否用小块内存完成任务、利用文件缓存等等);如果不掌握源代码的话,就只能从 Java 这边想办法了。前面我说过,作为一个单独的系统应用,申请 48M 内存并不算太过分的事情,你这里出现这个问题,十有八九是在 web 应用环境下并发访问造成的。所以要看看你的 web 应用这边,是怎么调用图像处理程序的,如果有大量并发的可能,就想办法做成串行处理的,或者至少搞个线程池来限制并发个数。错误信息中的那个字节数,应该是 native code 在辗转调用 AllocateHeap() 时申请的字节数。至于 AllocateHeap(),按我目前的理解(这次没有专门去查文档,不敢十分确定),应该是受 Windows 进程的额度限制(注意,是 Windows 系统提供给 JVM 进程的额度,而不是 JVM 提供给 Java 程序的额度,所以 -Xmx 之类的参数对此问题应该没有影响),而事实上这个额度限制就是整个操作系统的可用内存。如果要应急解决问题的话,可以考虑增大物理内存。不过,如果机制方面存在问题的话,多大的内存都有用爆的时候。
      

  23.   

    谢谢maquan详细的解释,我会对这方面的信息做出查证。若有不明之处仍望指教!
      

  24.   

    我今天也出现了这个问题:
    #
    # 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
    请问你后来是如何解决的?
      

  25.   

    #
    # 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
    !>_<
      

  26.   

    # 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
    #
      

  27.   

    我也碰到了ls的问题,ls是怎么解决的呢?期待指点