TOP > 技術メモ > Java > 障害調査(トラブルシューティング) > Java共通障害
Java共通障害
- ファイルディスクリプタの枯渇( Too many open Files ) [2013-08-16]
- スレッドの枯渇またはデッドロック [2013-08-16]
- Out of Memory が発生する [2014-02-10]
ファイルディスクリプタの枯渇( Too many open Files )
ファイルディスクリプタの枯渇が発生するとIOExceptionが発生する。
(ソケット通信でもファイルディスクリプタが使用されるため、大量にコネクションが張られると枯渇する)
" Linux または HP-UX ------------------------------ " # 以下の警告が発生している場合 # java.net.SocketException: Too many open files # ps -ef | grep java 等でプロセスIDを特定した後、 # 以下コマンドを実行してどのファイルが大量に掴まれているか把握する(Javaに限らず活用できる) pfiles [PID]
スレッドの枯渇またはデッドロック
スレッドダンプを取得して、どのスレッドが大量に発生しているかを調べる。
デッドロックが発生している場合も、スレッドダンプに出力される。
無限ループ処理の発見にも役立つ。
" Linux または HP-UX ------------------------------ " # ps -ef | grep java 等でプロセスIDを特定した後、 # QUIT(-3)シグナル送信を行い標準出力する(OSによってはファイルに出力される)。 kill -3 [プロセスID] " Windows ----------------------------------------- " # Javaのコンソールを開いている状態で(開いていないと使えない・・) # コマンドプロンプトから「Ctrl+Break」キーを押す " Java標準のツール ----------------------------------------- " >jps 2435 TarGetSample 2206 Jps >jstack 2435 2014-10-03 23:52:23 Full thread dump Java HotSpot(TM) Client VM (1.6.0-beta2-b86 mixed mode, sharing): "Low Memory Detector" daemon prio=6 tid=0x02b1ec00 nid=0x260 runnable [0x00000000..0x00000000] java.lang.Thread.State: RUNNABLE ・・・省略
Out of Memory が発生する
主な原因は以下
- アプリケーションのメモリリーク
- Javaヒープ(Heap)領域の不足
- Javaパーマネント(Permanent)領域の不足
- Cヒープ(物理メモリ)領域の不足
- スレッドスタック領域の不足(スレッドを生成する際のメモリ不足)
- スレッド生成数がOS指定値(カーネルパラメータ)を超過
- プロセス使用メモリがOS指定値(カーネルパラメータ)を超過
特に嵌ったのはHP-UXのカーネルパラメータ(maxdsiz, maxdsiz_64bit)。
WebLogicやWebOTXはサービスのデプロイ時にリーク起こしてんじゃないかってくらいCヒープ領域を食う。
そのためHeapやPermanent以外にCヒープ領域を枯渇させてしまいOutOfMemoryが発生する。
※ 独自クラスローダのJar読み込み処理に問題がありそうだが・・(StackTraceから)