SlideShare a Scribd company logo
Java をクラッシュさせて
遊んでみよう!
@YujiSoftware
Java をクラッシュさせる
• Java はめったにクラッシュしない?
• ところが、そうでもない!
– 特に、新しい機能はバグがあったりする
– 詳細は、バグデータベースに公開されている
• 今日は、OpenJDK のバグデータベースから見
つけたバグを再現して遊んでみました!
コンパイラのバグ
• JDK-8220018
• Switch式と
try…catch…finaly の組
み合わせで、コンパイ
ラがクラッシュする
• 実際に Java13 で試し
てみると…
public class SwTest {
public static void main(String[] args) {
System.out.println(switch (0) {
default -> {
try {
yield 1;
} catch (Exception ex) {
yield 2;
} finally {
yield 3;
}
}
});
}
}
再現しない (´・ω・` )
•クラッシュしなかった
– ちゃんとクラスファイルが生成された
C:JDK-8220018>C:Program FilesJavajdk-13binjavac" -source 13 --enable-preview
SwTest.java
注意:SwTest.javaはプレビュー言語機能を使用します。
注意:詳細は、-Xlint:previewオプションを指定して再コンパイルしてください。
C:JDK-8220018>dir
2019/11/23 01:33 605 SwTest.class
2019/11/23 01:33 400 SwTest.java
2 個のファイル 1,005 バイト
2 個のディレクトリ 24,369,549,312 バイトの空き領域
なぜ?
• 最新(Java 13)で、すでに修正されていた
– Java 12 で見つかったバグだった
– クラッシュバグは、すぐに直される
• 教訓
– バグレポートの修正バージョンや影響バージョン
をよく確認しよう
• 改めて、Java 12 でやってみると…
クラッシュした
• スタックトレースを吐いて落ちる
– 自らバグを認める
C:JDK-8220018>“C:Program FilesJavajdk-12binjavac” -source 12 --enable-preview SwTest.java
注意:SwTest.javaはプレビュー言語機能を使用します。
注意:詳細は、-Xlint:previewオプションを指定して再コンパイルしてください。
コンパイラで例外が発生しました(12)。Bug Database (http://bugs.java.com)で
重複がないかをご確認のうえ、Java bugレポート・ページ
(http://bugreport.java.com)でJavaコンパイラに対するbugの登録をお願いいた
します。レポートには、そのプログラムと下記の診断内容を含めてくだ さい。ご
協力ありがとうございます。
java.lang.AssertionError
at jdk.compiler/com.sun.tools.javac.util.Assert.error(Assert.java:155)
at jdk.compiler/com.sun.tools.javac.util.Assert.check(Assert.java:46)
at jdk.compiler/com.sun.tools.javac.jvm.Gen.visitBreak(Gen.java:1707)
at jdk.compiler/com.sun.tools.javac.tree.JCTree$JCBreak.accept(JCTree.java:1561)
at jdk.compiler/com.sun.tools.javac.jvm.Gen.genDef(Gen.java:595)
at jdk.compiler/com.sun.tools.javac.jvm.Gen.genStat(Gen.java:630)
at jdk.compiler/com.sun.tools.javac.jvm.Gen.genStat(Gen.java:616)
Java VM のバグ
• JDK-8226798
– JVM crash in
klassItable::initialize_itable_for_interface(int,
InstanceKlass*, bool, Thread*)
– 影響バージョン:8, 11, 12.0.1, 13, 14
– 修正バージョン:14
• パッケージプライベートのメソッドと、
インタフェースのデフォルトメソッドの両方で
同じメソッドが定義されているなどの条件で、
実行時に Java VM がクラッシュするバグ
再現コード
• なぜかデフォルトメソッドが2つあると再現する
らしい
public class VTableTest {
interface Intf {
public default void m() { }
public default void unusedButNeededToReproduceIssue() { }
}
static class B extends pkg.A implements Intf {
}
static class C extends B {
public void m() { System.out.println("In C.m()"); }
}
public static void main(String[] args) {
new C().m();
}
}
package pkg;
public class A {
void m() { }
}
!?
実行結果
• EXCEPTION_ACCESS_VIOLATIONでクラッシュ
C:JDK-8226798>"C:Program FilesJavajdk-13binjava" VTableTest
#
# A fatal error has been detected by the Java Runtime Environment:
#
# EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x00007ff8eaa6da4e, pid=11948, tid=13800
#
# JRE version: OpenJDK Runtime Environment (13.0+33) (build 13+33)
# Java VM: OpenJDK 64-Bit Server VM (13+33, mixed mode, sharing, tiered, compressed oops, g1 gc,
windows-amd64)
# Problematic frame:
# V [jvm.dll+0x50da4e]
#
# No core dump will be written. Minidumps are not enabled by default on client versions of Windows
#
# An error report file with more information is saved as:
# C:JDK-8226798hs_err_pid11948.log
#
# If you would like to submit a bug report, please visit:
# http://bugreport.java.com/bugreport/crash.jsp
正しい挙動は?
• バックポートされてる
– クラッシュバグは修正してくれることが多い
• なので、Java 11.0.5 では正しく動く
– このバージョンで実行すると…!
実行結果
•直ってなかった
– 同じ理由でクラッシュする
C:JDK-8226798>"C:Program FilesJavajdk-11.0.5binjava" VTableTest
#
# A fatal error has been detected by the Java Runtime Environment:
#
# EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x00007ff8eaab927e, pid=14008, tid=10528
#
# JRE version: Java(TM) SE Runtime Environment (11.0.5+10) (build 11.0.5+10-LTS)
# Java VM: Java HotSpot(TM) 64-Bit Server VM (11.0.5+10-LTS, mixed mode, tiered, compressed oops,
g1 gc, windows-amd64)
# Problematic frame:
# V [jvm.dll+0x51927e]
#
# No core dump will be written. Minidumps are not enabled by default on client versions of Windows
#
# An error report file with more information is saved as:
# C:JDK-8226798hs_err_pid14008.log
なぜ直っていないのか
• わからん (´・ω・`)
まとめ
• Java はバージョンによってバグがある
– 詳細はバグデータベースに公開されている
• 実際に再現させてみると面白い
– 思い通りにいかないことも多い
• みなさんも、ぜひ遊んでみてください!
Java をクラッシュさせて
遊んでみよう!
@YujiSoftware

More Related Content

PPTX
Oracle Database (CDB) on Docker を動かしてみる
PDF
ドメイン駆動設計(DDD)の実践Part2
PDF
これからのJDK 何を選ぶ?どう選ぶ? (v1.2) in 熊本
PDF
Javaのログ出力: 道具と考え方
PDF
全文検索でRedmineをさらに活用!
PDF
ドメインロジックに集中せよ 〜ドメイン駆動設計 powered by Spring
PDF
O/Rマッパーによるトラブルを未然に防ぐ
Oracle Database (CDB) on Docker を動かしてみる
ドメイン駆動設計(DDD)の実践Part2
これからのJDK 何を選ぶ?どう選ぶ? (v1.2) in 熊本
Javaのログ出力: 道具と考え方
全文検索でRedmineをさらに活用!
ドメインロジックに集中せよ 〜ドメイン駆動設計 powered by Spring
O/Rマッパーによるトラブルを未然に防ぐ

What's hot (20)

PDF
5G時代のアプリケーション開発とは - 5G+MECを活用した低遅延アプリの実現へ
PDF
コンテナの作り方「Dockerは裏方で何をしているのか?」
PPTX
マイクロサービスにおける 非同期アーキテクチャ
PDF
Open Liberty: オープンソースになったWebSphere Liberty
PDF
Dockerfileを改善するためのBest Practice 2019年版
PDF
[DO05] システムの信頼性を上げるための新しい考え方 SRE ( Site Reliability Engineering ) in Azure, o...
PDF
怖くないSpring Bootのオートコンフィグレーション
PDF
新入社員のための大規模ゲーム開発入門 サーバサイド編
PDF
「GraphDB徹底入門」〜構造や仕組み理解から使いどころ・種々のGraphDBの比較まで幅広く〜
PDF
[D20] 高速Software Switch/Router 開発から得られた高性能ソフトウェアルータ・スイッチ活用の知見 (July Tech Fest...
PDF
Keycloak拡張入門
PDF
Redmineの画面をあなた好みにカスタマイズ - View customize pluginの紹介 - Redmine Japan 2020
PPTX
大量のデータ処理や分析に使えるOSS Apache Spark入門(Open Source Conference 2021 Online/Kyoto 発表資料)
PPTX
初心者向けMongoDBのキホン!
PDF
ClassLoader Leak Patterns
PDF
Serf / Consul 入門 ~仕事を楽しくしよう~
PDF
オンプレミスRDBMSをAWSへ移行する手法
PPTX
Redisの特徴と活用方法について
PDF
Node RED で実現する製造業の DX
PDF
View customize pluginを使いこなす
5G時代のアプリケーション開発とは - 5G+MECを活用した低遅延アプリの実現へ
コンテナの作り方「Dockerは裏方で何をしているのか?」
マイクロサービスにおける 非同期アーキテクチャ
Open Liberty: オープンソースになったWebSphere Liberty
Dockerfileを改善するためのBest Practice 2019年版
[DO05] システムの信頼性を上げるための新しい考え方 SRE ( Site Reliability Engineering ) in Azure, o...
怖くないSpring Bootのオートコンフィグレーション
新入社員のための大規模ゲーム開発入門 サーバサイド編
「GraphDB徹底入門」〜構造や仕組み理解から使いどころ・種々のGraphDBの比較まで幅広く〜
[D20] 高速Software Switch/Router 開発から得られた高性能ソフトウェアルータ・スイッチ活用の知見 (July Tech Fest...
Keycloak拡張入門
Redmineの画面をあなた好みにカスタマイズ - View customize pluginの紹介 - Redmine Japan 2020
大量のデータ処理や分析に使えるOSS Apache Spark入門(Open Source Conference 2021 Online/Kyoto 発表資料)
初心者向けMongoDBのキホン!
ClassLoader Leak Patterns
Serf / Consul 入門 ~仕事を楽しくしよう~
オンプレミスRDBMSをAWSへ移行する手法
Redisの特徴と活用方法について
Node RED で実現する製造業の DX
View customize pluginを使いこなす
Ad

Similar to Java をクラッシュさせて遊んでみよう! (20)

PPTX
Java 9で進化する診断ツール
PPTX
HeapStatsのデモ (Java The Night)
PPTX
Cve 2013-0422
PDF
Javaはどのように動くのか~スライドでわかるJVMの仕組み
PDF
Java Concurrency, A(nother) Peek Under the Hood [Java Day Tokyo 2016 3-C]
PDF
JDK 13 New Features [MeetUp with Java Experts! @Gaienmae/Dojima 2019]
PDF
Groovyで楽にSQLを実行してみよう
PDF
Play framework 2.0のおすすめと1.2からのアップグレード
KEY
Inside frogc in Dart
PDF
HeapStats @ Seasar Conference 2015 LT
PDF
JDKツール使ってますか
PPTX
Serviceability Toolsの裏側
PPTX
JavaLearning_1.pptx
PDF
Javaone2012 BoF2-02 コンテナでテストをまわせ!Java EEへの自動テストの導入
PDF
Java/Androidセキュアコーディング
PPTX
Heap statsfx analyzer
PPT
2012年javaメモリリーク
PPTX
Introduction to GraalVM and Native Image
PDF
PDF
Play jjug2012spring
Java 9で進化する診断ツール
HeapStatsのデモ (Java The Night)
Cve 2013-0422
Javaはどのように動くのか~スライドでわかるJVMの仕組み
Java Concurrency, A(nother) Peek Under the Hood [Java Day Tokyo 2016 3-C]
JDK 13 New Features [MeetUp with Java Experts! @Gaienmae/Dojima 2019]
Groovyで楽にSQLを実行してみよう
Play framework 2.0のおすすめと1.2からのアップグレード
Inside frogc in Dart
HeapStats @ Seasar Conference 2015 LT
JDKツール使ってますか
Serviceability Toolsの裏側
JavaLearning_1.pptx
Javaone2012 BoF2-02 コンテナでテストをまわせ!Java EEへの自動テストの導入
Java/Androidセキュアコーディング
Heap statsfx analyzer
2012年javaメモリリーク
Introduction to GraalVM and Native Image
Play jjug2012spring
Ad

More from YujiSoftware (9)

PPTX
ラムダのコンパイル結果を5分で説明するよ​
PPTX
Javaはどれだけ速いのか
PPTX
技術書を読むと眠くなる!これを解決するために取った10の対策
PPTX
JEP280: Java 9 で文字列結合の処理が変わるぞ!準備はいいか!? #jjug_ccc
PPTX
Java を今すぐダウンロードしてみたお話
PPTX
JVM言語を使ってみようの歌
PPTX
AtCoderで始めるテスト駆動開発
PPTX
Javaでマサカリ投げてみた
PPTX
ジャバのはなし、JAVAのはなし、Javaのはなし
ラムダのコンパイル結果を5分で説明するよ​
Javaはどれだけ速いのか
技術書を読むと眠くなる!これを解決するために取った10の対策
JEP280: Java 9 で文字列結合の処理が変わるぞ!準備はいいか!? #jjug_ccc
Java を今すぐダウンロードしてみたお話
JVM言語を使ってみようの歌
AtCoderで始めるテスト駆動開発
Javaでマサカリ投げてみた
ジャバのはなし、JAVAのはなし、Javaのはなし

Java をクラッシュさせて遊んでみよう!

  • 2. Java をクラッシュさせる • Java はめったにクラッシュしない? • ところが、そうでもない! – 特に、新しい機能はバグがあったりする – 詳細は、バグデータベースに公開されている • 今日は、OpenJDK のバグデータベースから見 つけたバグを再現して遊んでみました!
  • 3. コンパイラのバグ • JDK-8220018 • Switch式と try…catch…finaly の組 み合わせで、コンパイ ラがクラッシュする • 実際に Java13 で試し てみると… public class SwTest { public static void main(String[] args) { System.out.println(switch (0) { default -> { try { yield 1; } catch (Exception ex) { yield 2; } finally { yield 3; } } }); } }
  • 4. 再現しない (´・ω・` ) •クラッシュしなかった – ちゃんとクラスファイルが生成された C:JDK-8220018>C:Program FilesJavajdk-13binjavac" -source 13 --enable-preview SwTest.java 注意:SwTest.javaはプレビュー言語機能を使用します。 注意:詳細は、-Xlint:previewオプションを指定して再コンパイルしてください。 C:JDK-8220018>dir 2019/11/23 01:33 605 SwTest.class 2019/11/23 01:33 400 SwTest.java 2 個のファイル 1,005 バイト 2 個のディレクトリ 24,369,549,312 バイトの空き領域
  • 5. なぜ? • 最新(Java 13)で、すでに修正されていた – Java 12 で見つかったバグだった – クラッシュバグは、すぐに直される • 教訓 – バグレポートの修正バージョンや影響バージョン をよく確認しよう • 改めて、Java 12 でやってみると…
  • 6. クラッシュした • スタックトレースを吐いて落ちる – 自らバグを認める C:JDK-8220018>“C:Program FilesJavajdk-12binjavac” -source 12 --enable-preview SwTest.java 注意:SwTest.javaはプレビュー言語機能を使用します。 注意:詳細は、-Xlint:previewオプションを指定して再コンパイルしてください。 コンパイラで例外が発生しました(12)。Bug Database (http://bugs.java.com)で 重複がないかをご確認のうえ、Java bugレポート・ページ (http://bugreport.java.com)でJavaコンパイラに対するbugの登録をお願いいた します。レポートには、そのプログラムと下記の診断内容を含めてくだ さい。ご 協力ありがとうございます。 java.lang.AssertionError at jdk.compiler/com.sun.tools.javac.util.Assert.error(Assert.java:155) at jdk.compiler/com.sun.tools.javac.util.Assert.check(Assert.java:46) at jdk.compiler/com.sun.tools.javac.jvm.Gen.visitBreak(Gen.java:1707) at jdk.compiler/com.sun.tools.javac.tree.JCTree$JCBreak.accept(JCTree.java:1561) at jdk.compiler/com.sun.tools.javac.jvm.Gen.genDef(Gen.java:595) at jdk.compiler/com.sun.tools.javac.jvm.Gen.genStat(Gen.java:630) at jdk.compiler/com.sun.tools.javac.jvm.Gen.genStat(Gen.java:616)
  • 7. Java VM のバグ • JDK-8226798 – JVM crash in klassItable::initialize_itable_for_interface(int, InstanceKlass*, bool, Thread*) – 影響バージョン:8, 11, 12.0.1, 13, 14 – 修正バージョン:14 • パッケージプライベートのメソッドと、 インタフェースのデフォルトメソッドの両方で 同じメソッドが定義されているなどの条件で、 実行時に Java VM がクラッシュするバグ
  • 8. 再現コード • なぜかデフォルトメソッドが2つあると再現する らしい public class VTableTest { interface Intf { public default void m() { } public default void unusedButNeededToReproduceIssue() { } } static class B extends pkg.A implements Intf { } static class C extends B { public void m() { System.out.println("In C.m()"); } } public static void main(String[] args) { new C().m(); } } package pkg; public class A { void m() { } } !?
  • 9. 実行結果 • EXCEPTION_ACCESS_VIOLATIONでクラッシュ C:JDK-8226798>"C:Program FilesJavajdk-13binjava" VTableTest # # A fatal error has been detected by the Java Runtime Environment: # # EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x00007ff8eaa6da4e, pid=11948, tid=13800 # # JRE version: OpenJDK Runtime Environment (13.0+33) (build 13+33) # Java VM: OpenJDK 64-Bit Server VM (13+33, mixed mode, sharing, tiered, compressed oops, g1 gc, windows-amd64) # Problematic frame: # V [jvm.dll+0x50da4e] # # No core dump will be written. Minidumps are not enabled by default on client versions of Windows # # An error report file with more information is saved as: # C:JDK-8226798hs_err_pid11948.log # # If you would like to submit a bug report, please visit: # http://bugreport.java.com/bugreport/crash.jsp
  • 10. 正しい挙動は? • バックポートされてる – クラッシュバグは修正してくれることが多い • なので、Java 11.0.5 では正しく動く – このバージョンで実行すると…!
  • 11. 実行結果 •直ってなかった – 同じ理由でクラッシュする C:JDK-8226798>"C:Program FilesJavajdk-11.0.5binjava" VTableTest # # A fatal error has been detected by the Java Runtime Environment: # # EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x00007ff8eaab927e, pid=14008, tid=10528 # # JRE version: Java(TM) SE Runtime Environment (11.0.5+10) (build 11.0.5+10-LTS) # Java VM: Java HotSpot(TM) 64-Bit Server VM (11.0.5+10-LTS, mixed mode, tiered, compressed oops, g1 gc, windows-amd64) # Problematic frame: # V [jvm.dll+0x51927e] # # No core dump will be written. Minidumps are not enabled by default on client versions of Windows # # An error report file with more information is saved as: # C:JDK-8226798hs_err_pid14008.log
  • 13. まとめ • Java はバージョンによってバグがある – 詳細はバグデータベースに公開されている • 実際に再現させてみると面白い – 思い通りにいかないことも多い • みなさんも、ぜひ遊んでみてください!