OpenJDK とらしゅー KUBOTA Yuji @sugarlife Java Casual Talk #1
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 に入れ替えて投げた犯人を火にくべる
• 英語読め