Download free for 30 days
Sign in
Upload
Language (EN)
Support
Business
Mobile
Social Media
Marketing
Technology
Art & Photos
Career
Design
Education
Presentations & Public Speaking
Government & Nonprofit
Healthcare
Internet
Law
Leadership & Management
Automotive
Engineering
Software
Recruiting & HR
Retail
Sales
Services
Science
Small Business & Entrepreneurship
Food
Environment
Economy & Finance
Data & Analytics
Investor Relations
Sports
Spiritual
News & Politics
Travel
Self Improvement
Real Estate
Entertainment & Humor
Health & Medicine
Devices & Hardware
Lifestyle
Change Language
Language
English
Español
Português
Français
Deutsche
Cancel
Save
EN
NI
Uploaded by
NTT DATA Technology & Innovation
278 views
静かに変わってきたクラスファイルを詳細に調べて楽しむ(JJUG CCC 2024 Fall講演資料)
静かに変わってきたクラスファイルを詳細に調べて楽しむ (JJUG CCC 2024 Fall講演資料) 2024年10月27日(日) NTTデータグループ Innovation技術部 阪田 浩一
Technology
◦
Read more
0
Save
Share
Embed
Embed presentation
1
/ 66
2
/ 66
3
/ 66
4
/ 66
5
/ 66
6
/ 66
7
/ 66
8
/ 66
Most read
9
/ 66
10
/ 66
11
/ 66
12
/ 66
13
/ 66
14
/ 66
15
/ 66
16
/ 66
17
/ 66
18
/ 66
19
/ 66
20
/ 66
21
/ 66
22
/ 66
23
/ 66
24
/ 66
25
/ 66
26
/ 66
27
/ 66
28
/ 66
29
/ 66
30
/ 66
31
/ 66
32
/ 66
33
/ 66
34
/ 66
35
/ 66
36
/ 66
37
/ 66
38
/ 66
39
/ 66
40
/ 66
41
/ 66
42
/ 66
43
/ 66
44
/ 66
45
/ 66
46
/ 66
47
/ 66
48
/ 66
49
/ 66
50
/ 66
51
/ 66
52
/ 66
53
/ 66
54
/ 66
55
/ 66
56
/ 66
57
/ 66
58
/ 66
59
/ 66
60
/ 66
61
/ 66
62
/ 66
63
/ 66
64
/ 66
65
/ 66
66
/ 66
More Related Content
PDF
Spark SQL - The internal -
by
NTT DATA OSS Professional Services
PDF
これからLDAPを始めるなら 「389-ds」を使ってみよう
by
Nobuyuki Sasaki
PPTX
分析指向データレイク実現の次の一手 ~Delta Lake、なにそれおいしいの?~(NTTデータ テクノロジーカンファレンス 2020 発表資料)
by
NTT DATA Technology & Innovation
PPTX
Kafkaを活用するためのストリーム処理の基本
by
Sotaro Kimura
PDF
DockerとPodmanの比較
by
Akihiro Suda
PDF
Apache Spark の紹介(前半:Sparkのキホン)
by
NTT DATA OSS Professional Services
PDF
Apache Kafkaって本当に大丈夫?~故障検証のオーバービューと興味深い挙動の紹介~
by
NTT DATA OSS Professional Services
PPTX
今こそ知りたいSpring Batch(Spring Fest 2020講演資料)
by
NTT DATA Technology & Innovation
Spark SQL - The internal -
by
NTT DATA OSS Professional Services
これからLDAPを始めるなら 「389-ds」を使ってみよう
by
Nobuyuki Sasaki
分析指向データレイク実現の次の一手 ~Delta Lake、なにそれおいしいの?~(NTTデータ テクノロジーカンファレンス 2020 発表資料)
by
NTT DATA Technology & Innovation
Kafkaを活用するためのストリーム処理の基本
by
Sotaro Kimura
DockerとPodmanの比較
by
Akihiro Suda
Apache Spark の紹介(前半:Sparkのキホン)
by
NTT DATA OSS Professional Services
Apache Kafkaって本当に大丈夫?~故障検証のオーバービューと興味深い挙動の紹介~
by
NTT DATA OSS Professional Services
今こそ知りたいSpring Batch(Spring Fest 2020講演資料)
by
NTT DATA Technology & Innovation
What's hot
PDF
OpenJDKのコミッタってどんなことしたらなったの?解決してきた技術課題の事例から見えてくる必要な知識と技術(JJUG CCC 2023 Spring)
by
NTT DATA Technology & Innovation
PPTX
大量のデータ処理や分析に使えるOSS Apache Sparkのご紹介(Open Source Conference 2020 Online/Kyoto ...
by
NTT DATA Technology & Innovation
PDF
40分でわかるHadoop徹底入門 (Cloudera World Tokyo 2014 講演資料)
by
hamaken
PDF
超実践 Cloud Spanner 設計講座
by
Samir Hammoudi
PDF
ストリーム処理を支えるキューイングシステムの選び方
by
Yoshiyasu SAEKI
PPTX
AlloyDBを触ってみた!(第33回PostgreSQLアンカンファレンス@オンライン 発表資料)
by
NTT DATA Technology & Innovation
PDF
Apache Sparkに手を出してヤケドしないための基本 ~「Apache Spark入門より」~ (デブサミ 2016 講演資料)
by
NTT DATA OSS Professional Services
PDF
YugabyteDBを使ってみよう(NewSQL/分散SQLデータベースよろず勉強会 #1 発表資料)
by
NTT DATA Technology & Innovation
PPTX
Azure Cosmos DB のキホンと使いドコロ
by
Kazuyuki Miyake
PDF
まずやっとくPostgreSQLチューニング
by
Kosuke Kida
PDF
わかる!metadata.managedFields / Kubernetes Meetup Tokyo 48
by
Preferred Networks
PPTX
Apache Kafka Best Practices
by
DataWorks Summit/Hadoop Summit
PDF
統計情報のリセットによるautovacuumへの影響について(第39回PostgreSQLアンカンファレンス@オンライン 発表資料)
by
NTT DATA Technology & Innovation
PDF
マルチテナント化で知っておきたいデータベースのこと
by
Amazon Web Services Japan
PDF
MHA for MySQLとDeNAのオープンソースの話
by
Yoshinori Matsunobu
PDF
KafkaとAWS Kinesisの比較
by
Yoshiyasu SAEKI
PDF
Vacuum徹底解説
by
Masahiko Sawada
PPTX
フックを使ったPostgreSQLの拡張機能を作ってみよう!(第33回PostgreSQLアンカンファレンス@オンライン 発表資料)
by
NTT DATA Technology & Innovation
PDF
PostgreSQLをKubernetes上で活用するためのOperator紹介!(Cloud Native Database Meetup #3 発表資料)
by
NTT DATA Technology & Innovation
PDF
バイトコードって言葉をよく目にするけど一体何なんだろう?(JJUG CCC 2022 Spring 発表資料)
by
NTT DATA Technology & Innovation
OpenJDKのコミッタってどんなことしたらなったの?解決してきた技術課題の事例から見えてくる必要な知識と技術(JJUG CCC 2023 Spring)
by
NTT DATA Technology & Innovation
大量のデータ処理や分析に使えるOSS Apache Sparkのご紹介(Open Source Conference 2020 Online/Kyoto ...
by
NTT DATA Technology & Innovation
40分でわかるHadoop徹底入門 (Cloudera World Tokyo 2014 講演資料)
by
hamaken
超実践 Cloud Spanner 設計講座
by
Samir Hammoudi
ストリーム処理を支えるキューイングシステムの選び方
by
Yoshiyasu SAEKI
AlloyDBを触ってみた!(第33回PostgreSQLアンカンファレンス@オンライン 発表資料)
by
NTT DATA Technology & Innovation
Apache Sparkに手を出してヤケドしないための基本 ~「Apache Spark入門より」~ (デブサミ 2016 講演資料)
by
NTT DATA OSS Professional Services
YugabyteDBを使ってみよう(NewSQL/分散SQLデータベースよろず勉強会 #1 発表資料)
by
NTT DATA Technology & Innovation
Azure Cosmos DB のキホンと使いドコロ
by
Kazuyuki Miyake
まずやっとくPostgreSQLチューニング
by
Kosuke Kida
わかる!metadata.managedFields / Kubernetes Meetup Tokyo 48
by
Preferred Networks
Apache Kafka Best Practices
by
DataWorks Summit/Hadoop Summit
統計情報のリセットによるautovacuumへの影響について(第39回PostgreSQLアンカンファレンス@オンライン 発表資料)
by
NTT DATA Technology & Innovation
マルチテナント化で知っておきたいデータベースのこと
by
Amazon Web Services Japan
MHA for MySQLとDeNAのオープンソースの話
by
Yoshinori Matsunobu
KafkaとAWS Kinesisの比較
by
Yoshiyasu SAEKI
Vacuum徹底解説
by
Masahiko Sawada
フックを使ったPostgreSQLの拡張機能を作ってみよう!(第33回PostgreSQLアンカンファレンス@オンライン 発表資料)
by
NTT DATA Technology & Innovation
PostgreSQLをKubernetes上で活用するためのOperator紹介!(Cloud Native Database Meetup #3 発表資料)
by
NTT DATA Technology & Innovation
バイトコードって言葉をよく目にするけど一体何なんだろう?(JJUG CCC 2022 Spring 発表資料)
by
NTT DATA Technology & Innovation
Similar to 静かに変わってきたクラスファイルを詳細に調べて楽しむ(JJUG CCC 2024 Fall講演資料)
PDF
Javaセキュアコーディングセミナー東京第1回 講義
by
JPCERT Coordination Center
PDF
Java 7 invokedynamic の概要
by
Taku Miyakawa
PDF
Javaコードが速く実⾏される秘密 - JITコンパイラ⼊⾨(JJUG CCC 2020 Fall講演資料)
by
NTT DATA Technology & Innovation
PDF
gen-class とバイトコード(第3回 gen-class 勉強会資料)
by
tnoda
PDF
Valhalla Update JJUG CCC Spring 2019
by
David Buck
PDF
Adaptive optimization of JIT compiler
by
nothingcosmos
PDF
Javaクラスファイルの読み方
by
y torazuka
PDF
JDK 13 New Features [MeetUp with Java Experts! @Gaienmae/Dojima 2019]
by
David Buck
PDF
InvokeDynamic at #shikadriven 2012
by
Go Tanaka
PDF
Javaヂカラ #Java最新動向 -Java 11 の新機能やOracle Code One 2018 発の最新技術トレンドを一気にキャッチアップ-
by
PE-BANK
PDF
Deep dive into instanceof
by
Hiroshi Saito
PPTX
9/14にリリースされたばかりの新LTS版Java 17、ここ3年間のJavaの変化を知ろう!(Open Source Conference 2021 O...
by
NTT DATA Technology & Innovation
PPT
ジェネリクスの基礎と応用 JJUG CCC 2012 Fall
by
nagise
PDF
Javaセキュアコーディングセミナー東京第1回演習の解説
by
JPCERT Coordination Center
PDF
Var handles jjug_ccc_spring_2018
by
David Buck
PPTX
Introduction to JIT Compiler in JVM
by
Koichi Sakata
PPTX
jvmlang.daitokai 1.0.0 MinCamlJを作ってみた
by
Kazuyoshi Kamitsukasa
PPTX
Panamaを先取り!? JVMCIでJITと遊ぶ
by
Yasumasa Suenaga
PDF
JJavaプログラム実行の仕組みと、高速・安定動作に向けた取り組み
by
日本Javaユーザーグループ
PPTX
Project lambda
by
Appresso Engineering Team
Javaセキュアコーディングセミナー東京第1回 講義
by
JPCERT Coordination Center
Java 7 invokedynamic の概要
by
Taku Miyakawa
Javaコードが速く実⾏される秘密 - JITコンパイラ⼊⾨(JJUG CCC 2020 Fall講演資料)
by
NTT DATA Technology & Innovation
gen-class とバイトコード(第3回 gen-class 勉強会資料)
by
tnoda
Valhalla Update JJUG CCC Spring 2019
by
David Buck
Adaptive optimization of JIT compiler
by
nothingcosmos
Javaクラスファイルの読み方
by
y torazuka
JDK 13 New Features [MeetUp with Java Experts! @Gaienmae/Dojima 2019]
by
David Buck
InvokeDynamic at #shikadriven 2012
by
Go Tanaka
Javaヂカラ #Java最新動向 -Java 11 の新機能やOracle Code One 2018 発の最新技術トレンドを一気にキャッチアップ-
by
PE-BANK
Deep dive into instanceof
by
Hiroshi Saito
9/14にリリースされたばかりの新LTS版Java 17、ここ3年間のJavaの変化を知ろう!(Open Source Conference 2021 O...
by
NTT DATA Technology & Innovation
ジェネリクスの基礎と応用 JJUG CCC 2012 Fall
by
nagise
Javaセキュアコーディングセミナー東京第1回演習の解説
by
JPCERT Coordination Center
Var handles jjug_ccc_spring_2018
by
David Buck
Introduction to JIT Compiler in JVM
by
Koichi Sakata
jvmlang.daitokai 1.0.0 MinCamlJを作ってみた
by
Kazuyoshi Kamitsukasa
Panamaを先取り!? JVMCIでJITと遊ぶ
by
Yasumasa Suenaga
JJavaプログラム実行の仕組みと、高速・安定動作に向けた取り組み
by
日本Javaユーザーグループ
Project lambda
by
Appresso Engineering Team
More from NTT DATA Technology & Innovation
PDF
強化されたEKSのオブザーバビリティ(AWS re:Invent 2025 re:cap LT 大会 発表資料)
by
NTT DATA Technology & Innovation
PDF
基礎から学ぶ PostgreSQL の性能監視 (PostgreSQL Conference Japan 2025 発表資料)
by
NTT DATA Technology & Innovation
PDF
SAFe実践から見えた、フレームワークより大切な組織変革の道程(Scrum Fest Sendai 2025 発表資料)
by
NTT DATA Technology & Innovation
PDF
開発中の新機能 Spark Declarative Pipeline に飛びついてみたが難しかった(JEDAI DAIS Recap#2 講演資料)
by
NTT DATA Technology & Innovation
PDF
PostgreSQL18新機能紹介(db tech showcase 2025 発表資料)
by
NTT DATA Technology & Innovation
PDF
PGConf.dev 2025 参加レポート (JPUG総会併設セミナー2025 発表資料)
by
NTT DATA Technology & Innovation
PDF
Can We Use Rust to Develop Extensions for PostgreSQL? (POSETTE: An Event for ...
by
NTT DATA Technology & Innovation
PDF
つくって壊して直して学ぶ Database on Kubernetes (CloudNative Days Summer 2025 発表資料)
by
NTT DATA Technology & Innovation
PDF
2025年現在のNewSQL (最強DB講義 #36 発表資料)
by
NTT DATA Technology & Innovation
PDF
Java in Japan: A Journey of Community, Culture, and Global Integration (JavaO...
by
NTT DATA Technology & Innovation
PDF
Unveiling the Hidden Layers of Java Class Files: Beyond Bytecode (Devnexus 2025)
by
NTT DATA Technology & Innovation
PDF
論理レプリケーションのアーキテクチャ (第52回 PostgreSQLアンカンファレンス@オンライン 発表資料)
by
NTT DATA Technology & Innovation
PDF
実はアナタの身近にある!? Linux のチェックポイント/レストア機能 (NTT Tech Conference 2025 発表資料)
by
NTT DATA Technology & Innovation
PDF
Apache Sparkに対するKubernetesのNUMAノードを意識したリソース割り当ての性能効果 (Open Source Conference ...
by
NTT DATA Technology & Innovation
PDF
PostgreSQL最新動向 ~カラムナストアから生成AI連携まで~ (Open Source Conference 2025 Tokyo/Spring ...
by
NTT DATA Technology & Innovation
PDF
pgbenchのスレッドとクライアント (第51回 PostgreSQLアンカンファレンス@オンライン 発表資料)
by
NTT DATA Technology & Innovation
PDF
PostgreSQLのgitレポジトリから見える2024年の開発状況 (第51回 PostgreSQLアンカンファレンス@オンライン 発表資料)
by
NTT DATA Technology & Innovation
PDF
ストリーム処理はデータを失うから怖い?それ、何とかできますよ! 〜Apahe Kafkaを用いたストリーム処理における送達保証〜 (Open Source...
by
NTT DATA Technology & Innovation
PDF
生成AI時代のPostgreSQLハイブリッド検索 (第50回PostgreSQLアンカンファレンス@オンライン 発表資料)
by
NTT DATA Technology & Innovation
PDF
DAIS2024参加報告 ~Spark中心にしらべてみた~ (JEDAI DAIS Recap 講演資料)
by
NTT DATA Technology & Innovation
強化されたEKSのオブザーバビリティ(AWS re:Invent 2025 re:cap LT 大会 発表資料)
by
NTT DATA Technology & Innovation
基礎から学ぶ PostgreSQL の性能監視 (PostgreSQL Conference Japan 2025 発表資料)
by
NTT DATA Technology & Innovation
SAFe実践から見えた、フレームワークより大切な組織変革の道程(Scrum Fest Sendai 2025 発表資料)
by
NTT DATA Technology & Innovation
開発中の新機能 Spark Declarative Pipeline に飛びついてみたが難しかった(JEDAI DAIS Recap#2 講演資料)
by
NTT DATA Technology & Innovation
PostgreSQL18新機能紹介(db tech showcase 2025 発表資料)
by
NTT DATA Technology & Innovation
PGConf.dev 2025 参加レポート (JPUG総会併設セミナー2025 発表資料)
by
NTT DATA Technology & Innovation
Can We Use Rust to Develop Extensions for PostgreSQL? (POSETTE: An Event for ...
by
NTT DATA Technology & Innovation
つくって壊して直して学ぶ Database on Kubernetes (CloudNative Days Summer 2025 発表資料)
by
NTT DATA Technology & Innovation
2025年現在のNewSQL (最強DB講義 #36 発表資料)
by
NTT DATA Technology & Innovation
Java in Japan: A Journey of Community, Culture, and Global Integration (JavaO...
by
NTT DATA Technology & Innovation
Unveiling the Hidden Layers of Java Class Files: Beyond Bytecode (Devnexus 2025)
by
NTT DATA Technology & Innovation
論理レプリケーションのアーキテクチャ (第52回 PostgreSQLアンカンファレンス@オンライン 発表資料)
by
NTT DATA Technology & Innovation
実はアナタの身近にある!? Linux のチェックポイント/レストア機能 (NTT Tech Conference 2025 発表資料)
by
NTT DATA Technology & Innovation
Apache Sparkに対するKubernetesのNUMAノードを意識したリソース割り当ての性能効果 (Open Source Conference ...
by
NTT DATA Technology & Innovation
PostgreSQL最新動向 ~カラムナストアから生成AI連携まで~ (Open Source Conference 2025 Tokyo/Spring ...
by
NTT DATA Technology & Innovation
pgbenchのスレッドとクライアント (第51回 PostgreSQLアンカンファレンス@オンライン 発表資料)
by
NTT DATA Technology & Innovation
PostgreSQLのgitレポジトリから見える2024年の開発状況 (第51回 PostgreSQLアンカンファレンス@オンライン 発表資料)
by
NTT DATA Technology & Innovation
ストリーム処理はデータを失うから怖い?それ、何とかできますよ! 〜Apahe Kafkaを用いたストリーム処理における送達保証〜 (Open Source...
by
NTT DATA Technology & Innovation
生成AI時代のPostgreSQLハイブリッド検索 (第50回PostgreSQLアンカンファレンス@オンライン 発表資料)
by
NTT DATA Technology & Innovation
DAIS2024参加報告 ~Spark中心にしらべてみた~ (JEDAI DAIS Recap 講演資料)
by
NTT DATA Technology & Innovation
静かに変わってきたクラスファイルを詳細に調べて楽しむ(JJUG CCC 2024 Fall講演資料)
1.
© 2024 NTT
DATA Japan Corporation © 2024 NTT DATA Japan Corporation 静かに変わってきたクラスファイルを 詳細に調べて楽しむ 2024年10月27日 JJUG CCC 2024 Fall 株式会社NTTデータグループ 阪田 浩一
2.
© 2024 NTT
DATA Japan Corporation 2 自己紹介 阪田 浩一 Koichi SAKATA 株式会社NTTデータグループ 所属 Javaチャンピオン OpenJDKコミッタ JVMがとにかく好き jyukutyo
3.
© 2024 NTT
DATA Japan Corporation © 2024 NTT DATA Japan Corporation 3 速習クラスファイル 3
4.
© 2024 NTT
DATA Japan Corporation 4 クラスファイル void main() { println("He } 0101010101010 javacコマンドなどを実行すると Javaコンパイラが動作する ソースファイル クラスファイル • 実行に必要な情報を持つ - バイトコードやコンスタントプールなど
5.
© 2024 NTT
DATA Japan Corporation 5 クラスファイル 0101010101010 クラスファイル cafe babe 0000 0034 001d 0a00 0600 0f09 0010 0011 0800 120a 0013 0014 0700 1507 0016 0100 063c 696e 6974 3e01 0003 2829 5601 0004 436f 6465 0100 0f4c 696e 654e 756d 6265 7254 ... バイナリエディタで開く 16進数形式 (バイナリファイル)
6.
© 2024 NTT
DATA Japan Corporation 6 クラスファイル概観 • https://blog.lse.epita.fr/2014/04/28/0xcafebabe-java-class-file-format- an-overview.html
7.
© 2024 NTT
DATA Japan Corporation 7 Attributes • クラス フィールド メソッドに含まれる情報を保持する • たとえば以下のものを表現するために使用する - コード - ローカル変数や定数値 - スタックや例外に関する情報 - インナークラスやBootstrapメソッド - アノテーション - 非推奨やシグネチャなどの補足情報 今回はAttributesにある内容について いくつか話します
8.
© 2024 NTT
DATA Japan Corporation 8 javapコマンドで逆アセンブル 0101010101010 クラスファイル cafe babe 0000 0034 001d 0a00 0600 0f09 0010 0011 0800 120a 0013 0014 0700 1507 0016 0100 063c 696e 6974 3e01 0003 2829 5601 0004 436f 6465 0100 0f4c 696e 654e 756d 6265 7254 ... javap -c HelloWorld class HelloWorld { HelloWorld(); Code: 0: aload_0 1: invokespecial #1 // Method java/lang/Object."<init>":()V 4: return public static void main(java.lang.String...); Code: 0: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream; 3: ldc #3 // String Hello, world! 5: invokevirtual #4 // Method java/io/PrintStream.println:(Ljava/lang/String;)V 8: return
9.
© 2024 NTT
DATA Japan Corporation 9 javapコマンド • -c オプションでクラスファイルを逆アセンブルして表示する - バイナリファイルであるクラスファイルを 読みやすい形式に変換する • -v オプションをつけて javap を実行すると 逆アセンブルしたクラスファイルの内容を 詳細に表示する • --helpで使用方法やオプションを出力する • 以後の説明では クラスファイルの内容は javap したものを使用します
10.
© 2024 NTT
DATA Japan Corporation © 2024 NTT DATA Japan Corporation 10 なぜクラスファイルについて? 動機と目的 1
11.
© 2024 NTT
DATA Japan Corporation 11 セッション内容について • 必要ですか? - すぐに必要としません • 役立ちますか? - すぐに役立つ可能性は極めて低いです • 楽しいですか? - Yes!!! - 興味深い 知的に面白い という意味で楽しい
12.
© 2024 NTT
DATA Japan Corporation 12 セッション内容について • 私自身がこうした内容が楽しいし好き • クラスファイルで一般的に観察することがない部分を 詳細に解説します - 終了後みなさんが手を動かしてセッション内容を実際に確かめてくれたら このセッションは大成功
13.
© 2024 NTT
DATA Japan Corporation © 2024 NTT DATA Japan Corporation 13 ソースファイルとクラスファイル 1
14.
© 2024 NTT
DATA Japan Corporation 14 ソースファイルとクラスファイルの仕様 • JLSとJVMSは別個の仕様である • Javaコードをクラスファイルに変換するのは 簡単なことではなく JVMSに合わせた複雑な処理となる - 変換処理をするのがJavaコンパイラである ファイル 仕様 ソースファイル Java言語仕様(JLS) クラスファイル Java仮想マシン仕様(JVMS) void main() println(" } CAFEBABE ソースファイル クラスファイル Javaコンパイラ
15.
© 2024 NTT
DATA Japan Corporation 15 Javaコンパイラの動作 コンパイラが以下のことをする場合は…ある?ない? 1. コンパイラが ソースファイルにあるメソッド以外で 独自にメソッドを作り クラスファイルに書き込む (デフォルトコンストラクタ以外で) - ある! 2. 同じソースファイルでもJDKのバージョンが異なると 生成するクラスファイルの内容が変わることがある - ある! • 上記2つの点を見ていきましょう!
16.
© 2024 NTT
DATA Japan Corporation © 2024 NTT DATA Japan Corporation 16 コンパイラが作るメソッド 1
17.
© 2024 NTT
DATA Japan Corporation 17 なぜコンパイラがメソッドを作るのか • 例:Java言語仕様(JLS)とJava仮想マシン仕様(JVMS)の違いに起因する場合 • メソッドを作ることで Javaコードの内容をクラスファイルで表現できるため - 端的に言うと "必要に迫られて" • コンパイラが作るメソッドを"合成メソッド"と言う
18.
© 2024 NTT
DATA Japan Corporation 18 どんなときにメソッドが作られるか • 例:共変戻り値を使ったとき public interface ReturnNumber { Number value(); } public class ReturnInteger implements ReturnNumber { public Integer value() { return Integer.valueOf(0); } }
19.
© 2024 NTT
DATA Japan Corporation 19 合成メソッド • $ javap -c ReturnInteger class ReturnInteger implements ReturnNumber { public java.lang.Integer value(); Code: 0: iconst_0 1: invokestatic #7 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer; 4: areturn public java.lang.Number value(); Code: 0: aload_0 1: invokevirtual #13 // Method value:()Ljava/lang/Integer; 4: areturn 実装クラスに書いていない Numberを戻り値とするvalue()メソッドがある!
20.
© 2024 NTT
DATA Japan Corporation 20 速習バイトコード(メソッド呼び出し) • 5種類のinvoke命令 Code: 1: invokestatic #7 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer; ... 1: invokevirtual #13 // Method value:()Ljava/lang/Integer; バイトコード命令 内容 invokestatic staticメソッド 呼び出し invokevirtual インスタンスメソッド 呼び出し invokespecial コンストラクタ privateメソッド スーパークラスメソッド 呼び出し invokeinterface インタフェースメソッド 呼び出し invokedynamic 動的に算出したコールサイト (後述) 呼び出し
21.
© 2024 NTT
DATA Japan Corporation 21 合成メソッド • $ javap -c ReturnInteger class ReturnInteger implements ReturnNumber { public java.lang.Integer value(); Code: 0: iconst_0 1: invokestatic #7 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer; 4: areturn public java.lang.Number value(); Code: 0: aload_0 1: invokevirtual #13 // Method value:()Ljava/lang/Integer; 4: areturn
22.
© 2024 NTT
DATA Japan Corporation 22 合成メソッド • $ javap -v ReturnInteger public java.lang.Number value(); descriptor: ()Ljava/lang/Number; flags: ACC_PUBLIC, ACC_BRIDGE, ACC_SYNTHETIC Code: stack=1, locals=1, args_size=1 0: aload_0 1: invokevirtual #13 // Method value:()Ljava/lang/Integer; 4: areturn • javap コマンドで合成メソッドを確認できる • SYNTHETIC とは合成という意味である • ソースコードのメソッド定義から派生させて作る 合成メソッドを"ブリッジメソッド"と言う 合成メソッド ブリッジ メソッド
23.
© 2024 NTT
DATA Japan Corporation 23 このセッションの確認ポイント 1. コンパイラが ソースファイルにあるメソッド以外で 独自にメソッドを作り クラスファイルに書き込む (デフォルトコンストラクタ以外で) - コンパイラが合成メソッドを作り 書き込む 2. 同じソースファイルでもJDKのバージョンが異なると 生成するクラスファイルの内容が変わる
24.
© 2024 NTT
DATA Japan Corporation © 2024 NTT DATA Japan Corporation 24 合成メソッドとインナークラス 2
25.
© 2024 NTT
DATA Japan Corporation 25 なぜインナークラスなのか 理由: 1. インナークラスで特定のコードを書くと 合成メソッドを作っていた(JDK 10まで) 2. 1をコンパイルしたときのクラスファイルの内容が変わった(JDK 11から) 解説すること: • どのようなコードでそうなるのか を見る • なぜ合成メソッドを作るのか を確認する • なぜクラスファイルの内容を変えたのか を確認する
26.
© 2024 NTT
DATA Japan Corporation 26 復習: インナークラスのインスタンス生成コード public class Outer { class Inner { } public static void main(String[] args) { // Innerインスタンスを生成するときは以下のように書く new Outer().new Inner(); } }
27.
© 2024 NTT
DATA Japan Corporation 27 合成メソッドを作るコード例 public class Outer { private void m_outerpriv() { System.out.println("called m_outerpriv"); } class Inner { public void test() { new Outer().m_outerpriv(); } } public static void main(String[] args) { new Outer().new Inner().test(); } } • インナークラスからアウタークラスのprivateメンバにアクセスする[1] [1] https://docs.oracle.com/javase/specs/jls/se23/html/jls-6.html#jls-6.6.1 実行の流れ
28.
© 2024 NTT
DATA Japan Corporation 28 JDK 10以前でコンパイルしたクラスファイル class Outer$Inner { ... public void test(); Code: 0: new #3 // class Outer 3: dup 4: invokespecial #4 // Method Outer."<init>":()V 7: invokestatic #5 // Method Outer.access$000:(LOuter;)V 10: return } • $ javap -c Outer¥$Inner コードは new Outer().m_outerpriv() だったのに!?
29.
© 2024 NTT
DATA Japan Corporation 29 JDK 10以前でコンパイルしたクラスファイル public class Outer { ... static void access$000(Outer); descriptor: (LOuter;)V flags: ACC_STATIC, ACC_SYNTHETIC Code: stack=1, locals=1, args_size=1 0: aload_0 1: invokespecial #1 // Method m_outerpriv:()V 4: return } • $ javap -v Outer SYNTHETICだが BRIDGEではない
30.
© 2024 NTT
DATA Japan Corporation 30 インナークラスからアウタークラスのprivateメソッド呼び出し(JDK 10以前) Innterクラスでは: ソースファイル クラスファイル Outerインスタンスの privateメソッド m_outerpriv() を呼び出す Outer.access$000(Outer) というstaticメソッドを呼び出す Outerクラスでは: • access$000(Outer) というstaticな合成メソッドを作った • access$000メソッド内で 引数のOuterインスタンスに対し m_outerpriv() を呼び出す 合成メソッドを経由して privateメソッドの呼び出しを実現している
31.
© 2024 NTT
DATA Japan Corporation 31 なぜ合成メソッドを経由させるのか JDK 10までの JVMS $5.4.4 より引用 A field or method R is accessible to a class or interface D if and only if any of the following is true: ... • R is private and is declared in D. フィールドまたはメソッドRにアクセス可能なクラスまたはインタフェースDとは、以下のことが真となる 場合のみに限る。 ... • Rがprivateでその宣言がDにある。 https://docs.oracle.com/javase/specs/jvms/se9/html/jvms-5.html#jvms-5.4.4 JVMではインナークラスといった概念は サポートされていないということ
32.
© 2024 NTT
DATA Japan Corporation 32 この実装であることの問題と課題 • ネストクラスからの別のネストクラスへのリフレクションによるメソッド呼び出しで Errorが発生するケースがある • Method Handle APIで直接ルックアップできないケースがある • シール・クラスの追加が予定されていた - JDK 17にて正式リリース • ジェネリクス特殊化も予定されている よってJVMSのネスト関連の仕様を 変更することにした
33.
© 2024 NTT
DATA Japan Corporation © 2024 NTT DATA Japan Corporation 33 ネストメイト 3
34.
© 2024 NTT
DATA Japan Corporation 34 JVMSの変更とクラスファイル • JDK 11で仕様変更により ネスト関連のコードに対し コンパイラは異なるクラスファイルを生成するようになった $ javap -c Outer¥$Inner(JDK 11でコンパイルしたクラス) class Outer$Inner { public void test(); Code: 0: new #7 // class Outer 3: dup 4: invokespecial #9 // Method Outer."<init>":()V 7: invokevirtual #10 // Method Outer.m_outerpriv:()V 10: return } Outerクラスにあった合成メソッドも 作られなくなった
35.
© 2024 NTT
DATA Japan Corporation 35 合成メソッドなしでどう実現したのか • 新概念"Nestmates(ネストメイト)" - mateの意味は"仲間" クラスメイト チームメイト ルームメイト • クラスファイルにある属性という項目に新しい属性を定義する - NestHost - NestMembers
36.
© 2024 NTT
DATA Japan Corporation 36 合成メソッドなしでどう実現したのか • 新概念"Nestmates(ネストメイト)" - mateの意味は"仲間" クラスメイト チームメイト ルームメイト • クラスファイルにある属性という項目に新しい属性を定義する - NestHost - NestMembers ネストクラスを持つクラス ネストしたクラス 保持する属性 NestMembers NestHost クラス ネストした クラス NestMemberの値 でわかる NestHostの値 でわかる
37.
© 2024 NTT
DATA Japan Corporation 37 NestHostとNestMembers $ javap -v Outer public class Outer ... NestMembers: Outer$Inner $ javap -v Outer¥$Inner class Outer$Inner ... NestHost: class Outer JVMSも合わせて 変更している JDK 23のJVMS $5.4.4 より引用 A field or method R is accessible to a class or interface D if and only if any of the following is true: ... • R is private and is declared by a class or interface C that belongs to the same nest as D, according to the nestmate test below. https://docs.oracle.com/javase/specs/jvms/se23/html/jvms-5.html#jvms-5.4.4
38.
© 2024 NTT
DATA Japan Corporation 38 このセッションの確認ポイント 1. コンパイラが ソースファイルにあるメソッド以外で 独自にメソッドを作り クラスファイルに書き込む (デフォルトコンストラクタ以外で) - コンパイラが合成メソッドを作り 書き込む 2. 同じソースファイルでもJDKのバージョンが異なると 生成するクラスファイルの内容が変わる - たとえば10以前と11以降でネストメイト関連が異なる
39.
© 2024 NTT
DATA Japan Corporation 39 ここまで何を話してきたのか 何を伝えたいのか • 最初に書いたときからコードはずっと同じである • どのバージョンでコンパイルしても同じ動作をする - 言い換えると 使うだけならとくに知らなくてよいことばかり話している • 調べる過程 深まる知識 面白い!楽しい! - みなさんもそう感じているなら このセッションは成功 - このような内容は 技術力のバックボーンでもある
40.
© 2024 NTT
DATA Japan Corporation © 2024 NTT DATA Japan Corporation 40 クラスファイルの内容変更と JVMの改善 4
41.
© 2024 NTT
DATA Japan Corporation 41 多数の文字列を一気に結合したことありますか private String f0="1", f1="1", f2="1", f3="1", f4="1", f5="1", f6="1", f7="1", f8="1", f9="1", f10="1", f11="1", f12="1", f13="1", f14="1", f15="1", f16="1", f17="1", f18="1", f19="1", f20="1", f21="1", f22="1", f23="1", f24="1", f25="1", f26="1", f27="1", f28="1", f29="1", f30="1", f31="1", f32="1", f33="1", f34="1", f35="1", f36="1", f37="1", f38="1", f39="1", f40="1", f41="1", f42="1", f43="1", f44="1", f45="1", f46="1", f47="1", f48="1", f49="1", f50="1", f51="1", f52="1", f53="1", f54="1", f55="1", f56="1", f57="1", f58="1", f59="1", f60="1", f61="1", f62="1", f63="1", f64="1", f65="1", f66="1", f67="1", f68="1", f69="1", f70="1", f71="1", f72="1", f73="1", f74="1", f75="1", f76="1", f77="1", f78="1", f79="1", f80="1", f81="1", f82="1", f83="1", f84="1", f85="1", f86="1", f87="1", f88="1", f89="1", f90="1", f91="1", f92="1", f93="1", f94="1", f95="1", f96="1", f97="1", f98="1", f99="1", f100="1",f101="1",f102="1",f103="1",f104="1",f105="1",f106="1",f107="1",f108="1",f109="1", f110="1",f111="1",f112="1",f113="1",f114="1",f115="1",f116="1",f117="1",f118="1",f119="1", f120="1",f121="1",f122="1"; public String toString() { return f0+","+ f1+","+ f2+","+ f3+","+ f4+","+ f5+","+ f6+","+ f7+","+ f8+","+ f9+"," + f10+","+ f11+","+ f12+","+ f13+","+ f14+","+ f15+","+ f16+","+ f17+","+ f18+"," + ... "," +f120+","+f121+","+f122; } 123個のStringオブジェクトを カンマ区切りで結合する
42.
© 2024 NTT
DATA Japan Corporation 42 実行するとどうなる?(JDK 22相当で試行) 1. クラッシュする 2. 正常に動作する 3. ハードウェアリソースを激しく消費しながら動作する 4. エラーが発生する public static void main(String[] args) { long start = System.currentTimeMillis(); long sink = 0L; while (System.currentTimeMillis() - start < 60000) { sink += new Test().toString().length(); } System.out.println(sink); } 意図としては 多数回実行させたい
43.
© 2024 NTT
DATA Japan Corporation 43 実行はできるがメモリを大量消費する(つまり3が正解) https://bugs.openjdk.org/browse/JDK-8327247 23で解消済み
44.
© 2024 NTT
DATA Japan Corporation 44 補足説明 • C2 - OpenJDKのJVMであるHotSpot VMが 持つ2種類のJITコンパイラのうちの1つ - もう1つがC1コンパイラ • C1とC2の違い - C1はコンパイル時間は短いが 生成する機械語は速くない - C2はコンパイル時間が長くなるが 生成する機械語が速い - HotSpot VMはデフォルトでは 両方とも使用する(階層型コンパイル) - 単純化して述べると あるメソッドを一定回数使用するとまずC1 さらに多く使用すると再度C2でJITコンパイルする
45.
© 2024 NTT
DATA Japan Corporation 45 実行するとどうなる?(JDK 22相当で試行) public static void main(String[] args) { long start = System.currentTimeMillis(); long sink = 0L; while (System.currentTimeMillis() - start < 60000) { sink += new Test().toString().length(); } System.out.println(sink); } 多数回実行して C2でコンパイルさせたい
46.
© 2024 NTT
DATA Japan Corporation 46 JDK 22相当で試してみた $ java -XX:CompileCommand=MemStat,Test::toString,print Test c1 Arena usage Test::toString(()Ljava/lang/String;): 23795992 [na 0 ra 22814112] (33712->23829704->23829704) c2 Arena usage Test::toString(()Ljava/lang/String;): 1169778424 [na 136679016 ra 1004706496] (33712->1169812136->2521320) Compilation memory statistics Legend: total : memory allocated via arenas while compiling NA : ...how much in node arenas (if c2) RA : ...how much in resource areas result : Result: 'ok' finished successfully, 'oom' hit memory limit, 'err' compilation failed ... total NA RA result #nodes time type #rc thread 1169778424 136679016 1004706496 ok 128797 25.622 c2 2 0x00007ffaf80e20c0 method Test::toString(()Ljava/lang/String;) このJITコンパイルだけで メモリ1.1Gを使用 (Linux-x64, Intel(R) Xeon(R) Platinum 8260M CPU @ 2.40GHz) OpenJDK 22相当
47.
© 2024 NTT
DATA Japan Corporation 47 発生状況を整理する • JDK 8は問題なし - チケットでは8u401で問題なし 手元の8u275でも問題なし • JDK 9 - 22で発生する - 注:文字列結合すべてで発生するわけではない 一般的な結合では問題なし - v1 + " " + v2 + " " + ... + " " + vn の n を1つ増やすと急激にメモリ消費量と時間が増加 • JDK 9以降で文字列結合に関連する変更はあったか?
48.
© 2024 NTT
DATA Japan Corporation 48 文字列結合のindy化 注:indy化により結合の実行パフォーマンスが 向上したケースが多くあり 今回の問題は 大多数の問題がないケースに対する まれなバグケースに過ぎない
49.
© 2024 NTT
DATA Japan Corporation 49 発生原因 • indyとはバイトコード命令のinvokeDynamicのこと • indy化によって 文字列結合でこうしたパターンがあると 問題が発生するようになっていた • 原因は文字列結合処理の内部詳細でスコープ外だが クラスファイルという主題から以下のことを見ていく - indy化の前はどうだったのか - なぜ文字列結合処理を変更したのか - indy化とは何をすることなのか
50.
© 2024 NTT
DATA Japan Corporation 50 単純化したクラス(変数 + リテラルの文字列結合) public class Test2 { private String f0 = "1"; @Override public String toString() { return f0 + ","; } }
51.
© 2024 NTT
DATA Japan Corporation 51 Java 8までの文字列結合に対するバイトコード(クラスファイル内容) // Java 8まで new #4 // class java/lang/StringBuilder dup invokespecial #5 // Method java/lang/StringBuilder."<init>":()V aload_0 getfield #3 // Field f0:Ljava/lang/String; invokevirtual #6 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; ldc #7 // String , invokevirtual #6 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; invokevirtual #8 // Method java/lang/StringBuilder.toString:()Ljava/lang/String; $ javap -c Test2 この処理自体は何も問題がない ではなぜ indy化という変更をしたのか?
52.
© 2024 NTT
DATA Japan Corporation 52 Java 8までの実装の問題点 • 処理自体に問題はない • 文字列結合は頻繁に呼び出す処理であり 実行パフォーマンスの面から今後変更したいという要望はあり得る - ただしクラスファイルへの出力内容を変更する必要がある そのためにはコンパイラも変更しなければならない • もし実行パフォーマンスを改善するために クラスファイルやコンパイラを変更せずに JVMを変更するだけで済む方法があるなら そうしたい Java 7で追加したバイトコード invokeDynamic (indy) を 使うことで この要望を実現できる!
53.
© 2024 NTT
DATA Japan Corporation 53 文字列結合のindy化 // Java 8まで new #4 // class java/lang/StringBuilder dup invokespecial #5 // Method java/lang/StringBuilder."<init>":()V aload_0 getfield #3 // Field f0:Ljava/lang/String; invokevirtual #6 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; ldc #7 // String , invokevirtual #6 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; invokevirtual #8 // Method java/lang/StringBuilder.toString:()Ljava/lang/String; $ javap -c Test2 // Java 9以降 aload_0 getfield #9 // Field f0:Ljava/lang/String; invokedynamic #15, 0 // InvokeDynamic #0:makeConcatWithConstants:(Ljava/lang/String;)Ljava/lang/String; areturn
54.
© 2024 NTT
DATA Japan Corporation 54 invokeDynamic(indy) • 実行時にコールするメソッドを決定できるような仕組みを提供する - JVM言語には動的型付け言語(JRubyなど)があり そうした言語の実行パフォーマンス向上のため • この命令の初回実行前に任意の処理を実行できるというメリットがある - この処理を実行するメソッドをBootstrapメソッドと言う - Bootstrapの内容として動的メソッド検索に限る必要はなく 他にも活用できる - たとえばBootstrapで何らかの処理をするメソッドを作って返し 命令の実行としてそれを呼び出せる - Javaでも8でのラムダ式で使い始め その後 文字列結合 レコードクラス switch式/文でのパターンマッチ などでも使用 • indyだけで1セッションできるような内容のため詳細な説明はしません - 参考になる他の方のセッション資料: https://speakerdeck.com/yujisoftware/invokedynamic-under-the-hood
55.
© 2024 NTT
DATA Japan Corporation 55 文字列結合でのindy • (不正確だが簡潔にわかりやすく述べると) 文字列結合ではクラスファイルに invokeDynamic とだけ出力しておいて 結合処理の内容はBootstrap内で実装してしまおう ということ $ javap -v Test2 • クラスファイルは以降変更しなくてよい • 関連する実装を修正するだけで 文字列結合処理を改善できる
56.
© 2024 NTT
DATA Japan Corporation 56 文字列結合でのindy • (不正確だが簡潔にわかりやすく述べると) 文字列結合ではクラスファイルに invokeDynamic とだけ出力しておいて 結合処理の内容はBootstrap内で実装してしまおう ということ $ javap -v Test2 ... aload_0 getfield #9 // Field f0:Ljava/lang/String; invokedynamic #15, 0 // InvokeDynamic #0:makeConcatWithConstants:(Ljava/lang/String;)Ljava/lang/String; areturn } BootstrapMethods: 0: #28 invokestatic java/lang/invoke/StringConcatFactory.makeConcatWithConstants: (Ljava/lang/invoke/MethodHandles$Lookup; Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/String; [Ljava/lang/Object; )Ljava/lang/invoke/CallSite; Method arguments: #26 , StringConcatFactoryクラスの makeConcatWithConstantsメソッドが indyのBootstrapメソッドとなる
57.
© 2024 NTT
DATA Japan Corporation 57 JDK 23での問題解消 • StringConcatFactoryクラスを修正した
58.
© 2024 NTT
DATA Japan Corporation 58 JDK 23での問題解消 • StringConcatFactoryクラスを修正した $ java -XX:CompileCommand=MemStat,Test::toString,print Test ... Compilation memory statistics Legend: total : memory allocated via arenas while compiling ... (以下は抜粋です) total NA RA result #nodes limit time type method 6419424 2456608 1374856 err 2621 1024M 0.390 c2 Test::toString(()Ljava/lang/S 1243664 0 1112752 ok - 1024M 0.393 c1 Test::toString(()Ljava/lang/S
59.
© 2024 NTT
DATA Japan Corporation © 2024 NTT DATA Japan Corporation 59 文字列結合は indy化で何を得たか 5
60.
© 2024 NTT
DATA Japan Corporation 60 引用: JEP 280 Indify String Concatenation 前後のパフォーマンス比較 JDK 10以降の 各バージョンで さらに改善している (Linux-x64, Intel(R) Xeon(R) Platinum 8358 CPU @ 2.60GHz) • https://cl4es.github.io/presentations/jvmls2024/draft.html
61.
© 2024 NTT
DATA Japan Corporation 61 indy化のメリット デメリット メリット デメリット • クラスファイルの出力内容を変えずに 改善作業ができる • 再コンパイルをしなくてもバージョンを 上げるだけで改善内容を適用できる • StringBuilder実装よりも JITコンパイルを適用しやすい • 仕組み上 初回実行時 Bootstrap分のオーバーヘッドがある (JDK 9だと30〜90ミリ秒[1]) 後続のBootstrapでは 上記オーバーヘッドの一部のみ実行 [1] https://cl4es.github.io/2019/05/14/String-Concat-Redux.html • 9以降とくに13までバージョンごとにオーバーヘッドを 削減してきた • 最新の計測データはないが初回でも 実行時間はJDK 8よりやや重い程度 • 結果として文字列結合全体のスループットは 大きく向上した
62.
© 2024 NTT
DATA Japan Corporation 62 文字列結合の改善詳細 • このセッションのスコープ外です • JVM Language Summit 2024ではその内容のセッションがありました 興味のある方は録画を観ることをおすすめします - Re-thinking Java String Concatenation - https://youtu.be/tgX38gvMpjs?si=lwVLxi2jElYIRgyZ
63.
© 2024 NTT
DATA Japan Corporation 63 ここまで何を話してきたのか 何を伝えたいのか • 最初に書いたときからコードはずっと同じである • 実行するJavaのバージョンを上げるだけで 全体的な実行パフォーマンスは向上する • どのようにコードを書くのか 機能を使うのか だけではなく どのように動いているのか を調べることはとても楽しい
64.
© 2024 NTT
DATA Japan Corporation © 2024 NTT DATA Japan Corporation 64 まとめ 6
65.
© 2024 NTT
DATA Japan Corporation 65 ここまで何を話してきたのか 何を伝えたいのか • 共変戻り値で合成メソッドを見ました • ネストメイトでJDK 11前後のクラスファイル差異を見ました • 文字列結合のindy化でランタイムの改善を見ました このセッションが終わったら… • 上記の内容を実際に手を動かして見てみよう! • 文字列結合の改善内容をもっと詳しく調べてみよう! • indyを含むバイトコードについても調べてみよう!