8

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

JDK:jdk1.6.0_21
服务器:Tomcat 7.0.2
操作系统:红帽企业 Linux 服务器 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 运行时环境检测到一个致命错误:
#
# java.lang.OutOfMemoryError: 为 Chunk::new 请求了 1958536 个字节。交换空间不足?
#
# 内部错误 (allocation.cpp:215), pid=18658, tid=589781904
# 错误:块::新
#
# JRE 版本:6.0_21-b06
# Java 虚拟机:Java HotSpot(TM) 服务器虚拟机(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]


当前编译任务:
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,AS 无穷大
平均负载: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) 服务器 VM (17.0-b16),由“java_re”和 gcc 3.2.1-7a (J2SE) 于 2010 年 6 月 22 日 01:04:46 构建发布)

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

在此先感谢,阿米特

4

3 回答 3

6

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

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

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

于 2011-06-14T00:00:19.333 回答
4

您正在运行大量影响内存的 JVM 参数。您是否尝试过根据经验删除每个选项以查看导致 OOM 的选项?这个特殊的 OOM 不是来自 Java 堆,而是来自 JVM 自己的 C 堆。

于 2010-12-14T04:23:51.087 回答
3

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

如果您一直在 Tomcat 实例中进行大量热加载,这可能就是由此造成的。热加载因泄漏内存而臭名昭著,实际上您对此无能为力……除了更频繁地退出并重新启动 Tomcat 之外。

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

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

于 2010-12-14T06:25:51.750 回答