OpenJDK
とらしゅー
KUBOTA Yuji
@sugarlife
Java Casual Talk #1
@sugarlife
•  某グループで OpenJDK サポート
– コアダンプ等の JVM 障害解析、(レ
アケースな) GC チューニングとか
– たまにパッチ書いて闇に消投稿
•  解析支援ツール HeapStats 開発
– 低オーバーヘッド命
– あっちこっちで元気に稼働中 :)
今日のお題
• カジュアルなトラシュー(を夢
見て色々あった)話
JDK9 を聞きたい人
4
http://www.slideshare.net/YujiKubota/jdk9-jjug
もしくは月末にある JavaOne2015 の報告会があるかも?
8月時点の新機能概要は以下 :p
OpenJDK 事例を聞きたい人
5
http://oss.nttdata.co.jp/hadoop/event/201510/
index.html
よく受けるトラブル
•  プロセスダウン
1. クラッシュ(コアダンプ)、無言でダウン
2. メモリ不足 (OutOfMemoryError等)
•  プロセス無反応、スローダウン
3. GC 長時間化 (JVM 起因の性能問題)
4. デッドロック、ループ
•  アプリエラー出力
5. スタックトレース
よくある困ったパターン
7
• ログがない
• 手作業ミスで(ログが)消し飛んだ
• サービス環境で重い処理(≒ログ
収集・解析) が禁止されている
• 個人情報関係で重要ログが来ない
いいから
8
• ログがない
• 手作業ミスで(ログが)消し飛んだ
• サービス環境で重い処理(≒ログ
収集・解析) が禁止されている
• 個人情報関係で重要ログが来ない
ログを取れ
よく受けるトラブル
•  プロセスダウン
1. クラッシュ(コアダンプ)、無言でダウン
2. メモリ不足 (OutOfMemoryError等)
•  プロセス無反応、スローダウン
3. GC 長時間化 (JVM 起因の性能問題)
4. デッドロック、ループ
•  アプリエラー出力
5. スタックトレース
ケース1. クラッシュ
10


ケース1. クラッシュ
•  必要なログ
– コアダンプ (core.<pid>)
•  ulimit –c unlimited で吐けるようにする
– エラーレポート(hs_err_pid<pid>.log)
•  -XX:ErrorFile=/path/to/hs_err_pid%p.log
•  カジュアルトラシュー
– レポートの Stack: 項目のトレースを読む
– 祈りながら JDK Bug System で検索
– 2-3 割ぐらいは当たる (※個人的な体感)
– 不発時はコアダンプと一緒にサポートへ
11


ケース2. メモリ不足
12


	
Exception in thread "TP-Processor9" java.lang.OutOfMemoryError: Java heap space
java.lang.OutOfMemoryError: Java heap space
at java.util.Arrays.copyOfRange(Arrays.java:3221)
at java.lang.String.<init>(String.java:233)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:723)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:723)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:643)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:723)
at java.lang.Thread.run(Thread.java:619)
java.lang.OutOfMemoryError: <message>
message: 10 種類以上ある
http://www.slideshare.net/YujiKubota/javalangoutofmemoryerror-java
ケース2. メモリ不足
•  必要なログ (パターン1)
– ヒープダンプ
•  jmap –dump:format=b,file=/path/to/file <pid>
– <pid> を /path/to/bin/java <core> にするとコアダ
ンプからも取れる
•  OOME 時に自動収集 (ヒープダンプとコア)
– -XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=/path/to/
-XX:OnOutOfMemoryError=`/bin/kill –ABRT %p`
•  カジュアルトラシュー
– ヒープダンプを Eclipse Memory Analyzer に
放り込んで被疑オブジェクトを絞り込む
13


ケース2. メモリ不足
•  必要なログ (パターン1)
– ヒープダンプ
•  jmap –dump:format=b,file=/path/to/file <pid>
– <pid> を /path/to/bin/java <core> にするとコアダ
ンプからも取れる
•  OOME 時に自動収集 (ヒープダンプとコア)
– -XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=/path/to/
-XX:OnOutOfMemoryError=`/bin/kill –ABRT %p`
•  カジュアルトラシュー
– ヒープダンプを Eclipse Memory Analyzer に
放り込んで被疑オブジェクトを絞り込む
14


脇道
•  Java Agent という機能がある
– バイトコードを動的に操作可能な、プロ
ファイリング/デバッグのテクニック
•  JVM TI という JVM のインターフェース
– JVM レベルで操作・把握可能
– コールバックを任意に設定可能
– プロファイラツールにはこれを利用した実
装もある
– ヒープにいるオブジェクト状況を継続的に
把握可能なツールも作れるのでは???
15


作れた(ケース2. メモリ不足)
•  必要なログ (パターン2)
– HeapStats
• -agentlib:heapstats
– rpm インストールが必要
» wget http://goo.gl/AfgA2x
» rpm –ivh heapstats_agent-*.x86_64rpm
– heapstats_snapshot.dat を回収
•  カジュアルトラシュー
– HeapStats Analyzer に放り込む
16


	
http://icedtea.classpath.org/wiki/HeapStats
一目で解れば正義
17


	
[B
byte[]
誰が参照してるかも取れる
18


	
[B
byte[]
参照関係にあるオブジェ
クトで一番インスタンス
数が多いオブジェクト共
ケース3. GC 長時間化
19


	
1085.695: [CMS-concurrent-sweep-start]
1086.736: [GC1086.736: [ParNew (promotion failed): 911243K-
>907358K(943744K), 0.1784670 secs] 3833880K->3894624K(4810368K),
0.2084860 secs] [Times: user=0.26 sys=0.00, real=0.20 secs]
GC locker: Trying a full collection because scavenge failed
1087.214: [Full GC1087.215: [CMS1103.749: [CMS-concurrent-sweep:
13.564/13.754 secs] [Times: user=15.84 sys=0.25, real=13.75 secs]
(concurrent mode failure): 2987266K->358385K(3866624K), 16.8898790 secs]
3894624K->358385K(4810368K), [CMS Perm : 129322K-
>129315K(262144K)], 20.8900340 secs] [Times: user=20.84 sys=0.00,
real=20.89 secs]
ケース3. GC 長時間化
•  必要なログ
– GCログ
•  -Xloggc:/path/to/gc_%t_pid%p.log
-XX:+PrintGCDetails
-XX:+PrintGCDateStamps
•  カジュアルトラシュー
– 基本戦略は GC ログを読んで時間が懸って
るフェーズやエラーに対して処置する
– 15分じゃ語り足りないので資料
•  CMS: http://goo.gl/9WyL33 (JJUG CCC 2014 Fall)
•  G1GC: JJUG CCC 2015 Fall 発表予定 20


ケース3. GC 長時間化
•  必要なログ
– GCログ
•  -Xloggc:/path/to/gc_%t_pid%p.log
-XX:+PrintGCDetails
-XX:+PrintGCDateStamps
•  カジュアルトラシュー
– 基本戦略は GC ログを読んで時間が懸って
るフェーズやエラーに対して処置する
– 15分じゃ語り足りないので資料
•  CMS: http://goo.gl/9WyL33 (JJUG CCC 2014 Fall)
•  G1GC: JJUG CCC 2015 Fall 発表予定 21


ケース4. デッドロック, ループ
22


	
•  スレッドダンプ取って調べる
– @yusuke さんのターン
ケース5. スタックトレース
23


	
• Exception 握り潰した犯人を
火にくべる
• 全然関係ない(ように見える)
Exception に入れ替えて投げ
た犯人を火にくべる
• 英語読め

OpenJDK トラブルシューティング #javacasual