YaSuenagによるJyukutyoへのJVMデバッグ指南

JVMデバッグのノウハウがまとまっててよい
5
Koichi Sakata (じゅくちょー) @jyukutyo

String#intern()を学び始めて、なぜか初めてperfをし、JMHでGCごとに測りだしたりしてる。

2018-12-21 11:38:13
Koichi Sakata (じゅくちょー) @jyukutyo

あれ、コアダンプ吐いた!そして @YaSuenag さんの"Core dump will be written. "も見えた!

2018-12-21 14:41:53
Koichi Sakata (じゅくちょー) @jyukutyo

これ、JVMのバグ??HelloWorldでいいので、 -XX:+PrintStringTableStatistics を実行してもらえませんか?OpenJDKの11、11.0.1、12だとSIGSEGVになりました。手元で試したところ、OpenJDK 7、Oracle JDK 8,9,10ではならないです。

2018-12-21 14:57:23
Koichi Sakata (じゅくちょー) @jyukutyo

残念!もうJBSにありましたー。- [JDK-8211821] PrintStringTableStatistics crashes JVM - Java Bug System bugs.openjdk.java.net/browse/JDK-821… twitter.com/jyukutyo/statu…

2018-12-21 14:59:04
Yasumasa Suenaga @YaSuenag

@jyukutyo これ、12で直ったことになってますが12でもダメだったんですか?

2018-12-21 18:33:35
Koichi Sakata (じゅくちょー) @jyukutyo

@YaSuenag 古い12で試しましたので、もう直っているかもしれません。またやってみます!

2018-12-21 21:10:11
Koichi Sakata (じゅくちょー) @jyukutyo

@YaSuenag build 12-ea+25では、もう直っていました!

2018-12-25 11:04:13
Yasumasa Suenaga @YaSuenag

@jyukutyo やはりそうでしたか。ちょっと残念でしたねw でも、修正内容は単純ながらもHotSpotのTLS廻りを理解するのにちょうどいいかもしれませんね。 hg.openjdk.java.net/jdk/jdk/rev/84… コアを見るいい練習になりそうな気がしました。

2018-12-25 11:18:14
Yasumasa Suenaga @YaSuenag

…ちなみに、私はいつもバグっぽいのは(解析に慣れてる)Fedoraの上でjdk/jdkのOpenJDKでテストして、そのまま修正に入ります。

2018-12-25 11:21:37
Koichi Sakata (じゅくちょー) @jyukutyo

@YaSuenag 修正、たったこれだけなんですね…!再度コアを見つつ、自分で適用してビルドしたりしてみます!ありがとうございます。

2018-12-25 11:28:17
Koichi Sakata (じゅくちょー) @jyukutyo

目的なくOpenJDKのソース読もうとすると、何をすればわからなかったけど、JBSの修正済みバグを自分で再現して修正も入れて試し、その原因箇所を読むの、めちゃいい感じ。ただし、めっちゃ時間がかかってる。

2018-12-26 12:50:31
Koichi Sakata (じゅくちょー) @jyukutyo

C++のコードで、 StringTable::dump(outputStream* st, bool verbose) を StringTable::dump(tty) と呼び出すの、デフォルト引数じゃないのに、bool verboseの値はどう設定されますか??

2018-12-26 13:36:06
Koichi Sakata (じゅくちょー) @jyukutyo

@YaSuenag ありがとうございます!デフォルト引数、ヘッダファイルに定義するのですね。

2018-12-26 14:12:44
Yasumasa Suenaga @YaSuenag

@jyukutyo そうとも限らないですが、アレ?と思ったらプロトタイプ宣言もチェックしてみることをおすすめします。オーバーロードされてることもよくあるので。

2018-12-26 14:39:12
Koichi Sakata (じゅくちょー) @jyukutyo

@YaSuenag はい!そうします!ありがとうございます。C++、まったく知らないので、とても助かります。

2018-12-26 14:42:35
KUBOTA Yuji @sugarlife

@jyukutyo @YaSuenag 力技だと grep -r "dump¥(" しちゃいますね

2018-12-26 14:46:31
Koichi Sakata (じゅくちょー) @jyukutyo

OpenJDKを秒単位でビルドできるマシンがほしい

2018-12-26 14:49:26
Koichi Sakata (じゅくちょー) @jyukutyo

ふーようやくStringTableの旅が一段落した気がする。ただ、この変更がどういう観点でImplementation of low latency data-structureとなったのかは、理解できていない。結局、僕の実力では、どこまで行っても理解できていない感触しかない。

2018-12-26 15:31:44
Koichi Sakata (じゅくちょー) @jyukutyo

あーなんかOSをLinuxメインにしたくなってきた。

2018-12-26 16:16:33
Koichi Sakata (じゅくちょー) @jyukutyo

うーん、何とかPrintAssemblyだけで、TLABにアロケートしてるところがわかってきた。

2018-12-26 18:28:24
Koichi Sakata (じゅくちょー) @jyukutyo

TLABSizeって効くのかな…?XX:TLABSize=524288にすると、アセンブリでは、0x128(%r15),%r10 で、TLABのサイズは296なんじゃないかと思うんだけど…

2018-12-26 19:05:20
Yasumasa Suenaga @YaSuenag

@jyukutyo 効いてないことはないと思いますよ: hg.openjdk.java.net/jdk/jdk/file/e… アセンブリがGASのMOVだと仮定するとsrcがR15の間接アドレッシングになってるので、R10へ何かロードしようとしています。なのでTLABに何かを書き込もうとしているようには見えないのですが… ポイントはR15がどこを指してるかですね。

2018-12-26 20:13:34
Yasumasa Suenaga @YaSuenag

最近某氏宛てのツイートが多い気がするw まぁ、JIT生成コードの謎を追うならコアとってHSDBとGDB両面から攻めていくのがいいかもしれない。場合によってはJITWatchでバイトコードとアセンブラ両面で攻めるのもアリかな。

2018-12-26 20:15:13
Koichi Sakata (じゅくちょー) @jyukutyo

@YaSuenag ありがとうございます! mov 0x118(%r15),%rax mov %rax,%r10 add $0x10,%r10 cmp 0x128(%r15),%r10 でした。ああ!間接アドレッシングを読めていませんでした。

2018-12-27 11:39:50