JJUG CCC 2014 Spring
JJUG CCC 2014 Springに行ってきました。
寝坊したり予定あったりで、結局聞けたのは1つだけ。
それすらも最後までいられませんでしたが。。。
Java トラブルに備えよう
上妻 宜人さん(JJUG)
OutOfMemoryError
GCログの出力
Java起動オプションにあらかじめ設定しておく
-XXloggc 出力先の指定(ファイル名に時分秒をつけた方が良い。再起動時に削除されない)
-XX:+PrintGCDetails 詳細情報の出力
-XX:+PrintGCDateStamps 日時を読みやすいフォーマットで出力
JDK7(8?)から、ログが自動でローテートできるオプションが追加された
GCViewerでログをグラフ化する
ヒープダンプ
コマンドラインで取得する方法
→ヒープサイズが大きいと数秒間フリーズする
エラー時に自動取得(Java起動オプション)
-XX:HeapDumpOnOutOfMemoryError
解析ではEclipseMemoryAnalyzerを使ってる
クラスヒストグラム
コマンドを打つと、ヒープを多く占めているクラスをテキストで取得できる
ヒープダンプに比べると負荷が少ない
jdk7,8 : jcmd
突出型のOOM
エラーが出た瞬間のダンプのみを出力してくれるオプション
-XX+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=出力先
じわじわ型のOOM
なるべく軽い負荷で継続的なログがほしい
定期的なヒストグラムの収集がいい
HeapSatsというオープンソースのツールが定期取得&グラフ化をしてくれる
スローダウン/タイムアウト
スローダウン
アプリケーションが停止→再起動で対処
→確実に迷宮入り
再起動前にスレッドダンプを取りましょう
1.4.2 : kill -3
JDK5 : jstack
JDK7u4 : jcmd
・可視化ツールその1「侍」
スレッドの状態を時系列に表示
・可視化ツールその2「ThreadLogic」
怪しいスレッドをマーキングしてくれる
最初にみるならこちらの方が良い
無限ループ
HashMapへのマルチスレッドアクセス
→ConcurrentHashMapに変換する
原因がよくわからない場合
JDK標準のhprofプロファイラで調査
java -agentlib:hprof=CPU=samples,file=出力先
収集対象がアクティブなスレッドのみ
sleepやwaitによる遅延は検知できない