java.lang.OutOfMemoryError:为Chunk :: new请求了1958536个字节。 超出交换空间

我们在生产环境中以不可预测的方式面临以下问题,有时服务器在一天或有时在一周内停机,下面是确切的错误转储,下面是服务器的设置。

 JDK:jdk1.6.0_21
服务器:Tomcat 7.0.2
操作系统:Red Hat Enterprise Linux Server 5.5版

在catalina.sh中,已完成以下设置:

JAVA_OPTS="-Xms1024M -Xmx1536M -XX:+HeapDumpOnOutOfMemoryError -XX:+AggressiveOpts -XX:-DisableExplicitGC -XX:AdaptiveSizeThroughPutPolicy=0 -XX:+UsePSAdaptiveSurvivorSizePolicy -XX:+UseAdaptiveGenerationSizePolicyAtMinorCollection -XX:+UseAdaptiveGenerationSizePolicyAtMajorCollection -XX:PermSize=768M -XX:MaxPermSize=768M -XX:+PrintGCDetails -Xloggc:/tmp/gcLogs.txt" export CATALINA_OPTS="-Dcom.sun.management.jmxremote.port=22222 -Dcom.sun.management.jmxremote.authenticate=true -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.password.file=/jakarta-tomcat7/apache-tomcat-7.0.2/conf /jmxremote.password -Dcom.sun.management.jmxremote.access.file=/jakarta-tomcat7/apache- tomcat-7.0.2/conf/jmxremote.access" 

错误追踪: –

 #
 #Java Runtime Environment检测到致命错误:
 #
 #java.lang.OutOfMemoryError:为Chunk :: new请求了1958536个字节。 交换空间?
 #
 #Internal Error(allocation.cpp:215),pid = 18658,tid = 589781904
 #Error:Chunk :: new
 #
 #JRE版本:6.0_21-b06
 #Java VM:Java HotSpot(TM)服务器VM(17.0-b16混合模式linux-x86)
 #如果您想提交错误报告,请访问:
 #http://java.sun.com/webapps/bugreport/crash.jsp
 #

 ---------------线程---------------

当前线程(0x23787400):JavaThread“CompilerThread0”守护进程[_thread_in_native,id = 18668,stack(0x231f5000,0x23276000)]

堆栈:[0x231f5000,0x23276000],sp = 0x23272e70,可用空间= 1f723276000k
本机帧:(J =已编译的Java代码,j =已解释,Vv = VM代码,C =本机代码)
 V [libjvm.so + 0x6a9262]
 V [libjvm.so + 0x2b277f]
 V [libjvm.so + 0x12e03c]
 V [libjvm.so + 0x12e536]
 V [libjvm.so + 0x5d67d0]
 V [libjvm.so + 0x2f809d]
 V [libjvm.so + 0x4f65a9]
 V [libjvm.so + 0x27b85f]
 V [libjvm.so + 0x278043]
 V [libjvm.so + 0x209767]
 V [libjvm.so + 0x280f8c]
 V [libjvm.so + 0x280839]
 V [libjvm.so + 0x66feb6]
 V [libjvm.so + 0x66959e]
 V [libjvm.so + 0x57a89e]
 C [libpthread.so.0 + 0x5832]


当前CompileTask:
 C2:3230!  org.apache.jsp.com.common.press_jsp._jspService(Ljavax / servlet / http / HttpServletRequest; Ljavax / servlet / http / HttpServletResponse;)V(4433字节)


 ---------------过程---------------

 Java线程:( =>当前线程)
   0x09a21400 JavaThread“http-8080-exec-904”守护进程[_thread_in_native,id = 17126,stack(SIGTERM:[libjvm.so + 0x57aaf0],sa_mask [0] = 0x7ffbfeff,sa_flags = 0x10000004
 SIGQUIT:[libjvm.so + 0x57aaf0],sa_mask [0] = 0x7ffbfeff,sa_flags = 0x10000004


 ---------------系统---------------

操作系统:Red Hat Enterprise Linux Server 5.5版(Tikanga)

 uname:Linux 2.6.18-194.17.1.el5PAE#1 SMP Mon Sep 20 07:34:07 EDT 2010 i686
 libc:glibc 2.5 NPTL 2.5 
 rlimit:堆栈10240k,核心0k,NPROC 114688,NOFILE 1024,无限远
平均负荷:0.39 0.54 0.38

 CPU:总计2(每个CPU 2个核心,每个核心1个线程)系列6模型15步进11,cmov,cx8,fxsr,mmx,sse,sse2,sse3,ssse3

内存:4k页,物理6228576k(225096k免费),交换6974456k(6974352k免费)

 vm_info:适用于linux-x86 JRE(1.6.0_21-b06)的Java HotSpot(TM)服务器虚拟机(17.0-b16),于2010年6月22日01:04:46由“java_re”与gcc 3.2.1-7a(J2SE)构建发布)

时间:2010年12月10日星期五14:01:06
经过时间:79552秒

先谢谢,阿米特

对于记录(和谷歌),这看起来像这 两个错误,修复在sun的jdk的1.6u22版本中。 所以,首先要做的是更新你的JVM。 如果它仍然发生,并且总是在特定方法上发生,那么您可以使用以下jvm标志从编译中排除该方法(只要您知道它的性能影响):

 -XX:CompileCommand=exclude,org/apache/velocity/runtime/directive/Foreach,render 

(如此处所示 )。 但是,首先更新你的jvm。

你正在运行许多影响内存的JVM args。 您是否尝试过凭经验删除每个选项以查看哪个选项导致OOM? 这个特殊的OOM不是来自Java堆,而是来自JVM自己的C堆。

正如其他答案/评论所述,您的内存不足。 鉴于您的JVM设置,我会说根本原因是99%可能是内存泄漏。

如果您在Tomcat实例中进行了大量热加载,那可能只是由此造成的。 热负载因泄漏内存而臭名昭着,在实践中你无能为力……除了更频繁地退出和重启你的Tomcat。

另一种可能性是您的应用程序正在泄漏内存。 如果是这种情况,那么您将需要使用内存分析器来追踪泄漏。

OOME导致JVM崩溃的事实很有意思,但可能并不重要。 (看起来JVM试图在内存不足时JIT编译从JSP生成的类。请求的块相当大,但这可能意味着你有一个相当大/复杂的JSP。)