8

私たちは本番環境で以下の問題に直面しています。サーバーが 1 日または 1 週間でダウンするという予測不可能な方法で発生します。以下は正確なエラー ダンプです。以下はサーバーの設定です。

JDK: jdk1.6.0_21
サーバー: Tomcat 7.0.2
OS: 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 ランタイム環境によって致命的なエラーが検出されました:
#
# java.lang.OutOfMemoryError: Chunk::new に 1958536 バイトが要求されました。スワップ領域が不足していますか?
#
# 内部エラー (allocation.cpp:215)、pid=18658、tid=589781904
# エラー: 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]


現在のコンパイル タスク:
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


-  -  -  -  -  -  - - システム  -  -  -  -  -  -  - -

OS: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: Java HotSpot(TM) Server VM (17.0-b16) for linux-x86 JRE (1.6.0_21-b06)、2010 年 6 月 22 日 01:04:46 に "java_re" によって gcc 3.2.1-7a (J2SE) でビルドリリース)

時刻: 2010 年 12 月 10 日金曜日 14:01:06
経過時間: 79552 秒

前もってありがとう、アミット

4

3 に答える 3

4

メモリに影響を与える多くの JVM 引数を使用して実行しています。経験的に各オプションを削除して、どのオプションが OOM を引き起こしているかを確認しましたか? この特定の OOM は Java ヒープからではなく、JVM 自身の C ヒープからのものです。

于 2010-12-14T04:23:51.087 に答える
3

他の回答/コメントで述べたように、メモリが不足しています。JVM の設定を考えると、根本的な原因は 99% の可能性がメモリ リークであると言えます。

Tomcat インスタンスで多くのホット ロードを行っている場合、これが原因である可能性があります。ホット ロードはメモリ リークで悪名高く、実際にできることはあまりありません。Tomcat を終了して再起動する頻度を増やすこと以外はできません。

もう 1 つの可能性は、アプリケーションがメモリ リークを起こしていることです。この場合、メモリ プロファイラーを使用してリークを追跡する必要があります。

OOME が JVM クラッシュを引き起こしたという事実は興味深いものですが、おそらく重要ではありません。(JVM は、メモリ不足のときに JSP から生成されたクラスを JIT コンパイルしようとしていたようです。要求されているチャンクはかなり大きいですが、それはおそらく、かなり大きく複雑な JSP を持っていることを意味します。)

于 2010-12-14T06:25:51.750 に答える