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 GC.class_histgram

突出型のOOM

エラーが出た瞬間のダンプのみを出力してくれるオプション
-XX+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=出力先

じわじわ型のOOM

なるべく軽い負荷で継続的なログがほしい

定期的なヒストグラムの収集がいい
HeapSatsというオープンソースのツールが定期取得&グラフ化をしてくれる

スローダウン/タイムアウト

スローダウン

アプリケーションが停止→再起動で対処
 →確実に迷宮入り

再起動前にスレッドダンプを取りましょう
 1.4.2 : kill -3
 JDK5 : jstack
 JDK7u4 : jcmd Thread.print

・可視化ツールその1「侍」
スレッドの状態を時系列に表示

・可視化ツールその2「ThreadLogic」
怪しいスレッドをマーキングしてくれる
最初にみるならこちらの方が良い

無限ループ
 HashMapへのマルチスレッドアクセス
 →ConcurrentHashMapに変換する

原因がよくわからない場合

JDK標準のhprofプロファイラで調査

java -agentlib:hprof=CPU=samples,file=出力先

収集対象がアクティブなスレッドのみ
sleepやwaitによる遅延は検知できない