Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
JVM入門 -Javaプログラムが動く仕組み-
Search
Kinoko
November 23, 2019
Technology
35
13k
JVM入門 -Javaプログラムが動く仕組み-
2019/11/23 JJUG CCC 2019 Fall - 日本Javaユーザーグループ 登壇資料です。
Kinoko
November 23, 2019
Tweet
Share
More Decks by Kinoko
See All by Kinoko
自作キーボードにチャレンジしてみた。 ver 2.0
sammy7th
0
1.7k
私が考える理想の開発チーム
sammy7th
0
540
ビジネスルールを軸とした ソフトウェア開発手法 「CCSR」
sammy7th
7
2.4k
お家に居れなくなって 3週間ゲストハウス暮らしをしていた話
sammy7th
2
440
家で仕事中にインターフォンに気づかず困っているのでIoTでなんとかしたい
sammy7th
1
120
ホットサンドメーカーで作るスイーツ
sammy7th
0
220
Udemyでプログラミング の動画講座を販売してみた
sammy7th
1
750
Git運用基礎
sammy7th
1
250
エンジニア向け合同説明会「就活GeekHub」イベント説明
sammy7th
1
2.8k
Other Decks in Technology
See All in Technology
UU数 160%成長を支えたエンジニアと共創するテックブログ醸成術 / cocreating tech blog cultivation with engineers
carta_engineering
3
740
『実践オブジェクト指向設計』および『実践データベース設計』事前課題
recruitengineers
PRO
1
2k
DatadogでPHP・Laravelアプリケーションを監視する / monitoring-php-laravel-using-datadog
m_norii
0
160
Entra IDとJamfで実現する金融業界のセキュリティ対策 〜デバイストラストへの道のり〜
ken_hikita
2
990
開源專案的商業困境
tjjh89017
0
240
Ai Workforceを支える技術
layerx
PRO
1
160
使われないダッシュボードを生まないためのプロジェクトマネジメント / Project management to avoid creating unused dashboards
sansan_randd
4
1.1k
署名とゼロ知識証明の初歩
herumi
6
3.6k
サイボウズ 開発本部採用ピッチ / Cybozu Engineer Recruit
cybozuinsideout
PRO
9
40k
現代的システム開発概論 2024
recruitengineers
PRO
87
30k
リフレッシュ!お楽しみ企画 / Reflesh! The Fun Project - InnerSource Gathering Tokyo 2024
piyonakajima
2
160
20240811_若手エンジニアふんわりLT資料
tomi_t0mmy
0
260
Featured
See All Featured
In The Pink: A Labor of Love
frogandcode
139
22k
Building Effective Engineering Teams - LeadDev
addyosmani
56
2.3k
WebSockets: Embracing the real-time Web
robhawkes
59
7.2k
Building a Modern Day E-commerce SEO Strategy
aleyda
35
6.7k
Done Done
chrislema
180
16k
Building Adaptive Systems
keathley
35
2.1k
What's new in Ruby 2.0
geeforr
339
31k
It's Worth the Effort
3n
181
27k
Put a Button on it: Removing Barriers to Going Fast.
kastner
58
3.3k
Building a Scalable Design System with Sketch
lauravandoore
458
32k
Thoughts on Productivity
jonyablonski
65
4.1k
The Mythical Team-Month
searls
218
43k
Transcript
JVM⼊⾨ Javaプログラムが動く仕組み Abe Asami (きの⼦)
⾃⼰紹介 "CF"TBNJl͖ͷࢠz େࡕͷϑϦʔϥϯεϓϩάϥϚ IUUQOPDPOPOFU !BBUI +BWB,PUMJO4DBMBͳͲͳͲ
最近やっていること https://www.geekhub.jp/ ΤϯδχΞಛԽ߹ಉઆ໌ձΠϕϯτɻ࣍ճ 1/25() ։࠵༧ఆ ʮJava11ʹΑΔ WebΞϓϦέʔγϣϯ։ൃͰֶͿ Javaϓϩάϥϛϯάೖʯൢചத https://www.udemy.com/java11-springbootweb-java/
このセッションのターゲット • JavaͰ։ൃΛ͍ͯ͠Δ͕ɺJVM͕ԿΛ͍ͯ͠ Δͷ͔Α͘Βͳ͍ਓ • ώʔϓɺGCɺOutOfMemoryɺJITɺ HotSpotɺGraal…ͳͲͳͲ͍ΖΜͳ༻ޠΛࣖ ʹ͢Δ͕Α͘Θ͔Βͳ͍
このセッションのゴール • JVMपΓͷ༻ޠ͕;ΜΘΓཧղͰ͖ΔΑ͏ʹͳΔ • JVM͕ԿΛ͍ͬͯΔ͔͕ͳΜͱͳ͘Θ͔ΔΑ͏ ʹͳΔ • JVMपΓͰࠔΓ͝ͱʹૺ۰ͨ͠߹ʹͲ͏ղੳ͠ ͯରॲ͢Ε͍͍ͷ͔ɺΞλϦΛ͚ͭΔ͜ͱ͕Ͱ ͖ΔΑ͏ʹͳΔ
JVMとは?
JavaVM (Java仮想マシン) • JavaόΠτίʔυΛ࣮ߦ͢ΔͨΊͷԾڥ • OSґଘΛٵऩ
JDK‧JREとJVMの関係 • JRE(Java Runtime Environment) • JavaΛ࣮ߦ͢ΔͨΊʹඞཁͳιϑτΣΞηοτ • JVMΛؚΉ •
JDK(Java Development Kit) • JavaͷιϑτΣΞ։ൃΛߦ͏ͨΊʹඞཁͳιϑτΣΞ ηοτ • JREΛؚΉ
None
Javaのコードが JVM上で動くまで
Javaソースコード
コンパイル
Javaバイトコードを含む クラスファイルが⽣成される バイナリファイルであるため そのままだと読めないので、 「javap」コマンドで⼈間に読 める形に逆アセンブル
実⾏
Hello! World!
実⾏の流れ ᶃ JVMىಈ ᶄ ϩʔυ (Ϋϥεϩʔμʔ͕ඞཁͳΫϥεϑΝΠϧΛಡΈࠐΉ) ᶅ ϦϯΫ(Ϋϥε͕ഁଛ͍ͯ͠ͳ͍͔ͷݕূࢀরͷղܾ) ᶆ ॳظԽ(staticϑΟʔϧυͷॳظԽͳͲ)
ᶇ mainϝιου࣮ߦ
バイトコードは1⾏ずつ実⾏される
でもそれだと処理速度が遅い‧‧‧
「JITコンパイラ」 ͦ͜Ͱొ͢Δͷ͕
JITコンパイラ (Just In Time Compiler) • ࣮ߦ࣌ʹίϯύΠϧΛߦ͍ॲཧΛ࠷దԽ͢Δ • ྫ͑Α͘ݺͼग़͞ΕΔॲཧʹ͍ͭͯ࠷ దԽΛߦͳ͏ͳͲɺ࣮ߦ݁ՌΛݩʹॲཧ
Λߦͳ͏ • JavajavacʹΑΔΫϥεϑΝΠϧͷίϯύ Πϧͱɺ͜ͷ࣮ߦ࣌ͷίϯύΠϧ͕͋Δ
Javaバイトコードは「命令」 • JavaԾϚγϯͷ໋ྩηοτ • ྫʣ i2fɾɾɾintΛfloatʹม faddɾɾɾfloatͷՃࢉΛߦͳ͏
JVMはスタックマシン • ʮελοΫʯͱݺΕΔྖҬʹ໋ྩΛPushɾ Pop͠ͳ͕ΒɺϓϩάϥϜΛ࣮ߦ͍ͯ͘͠
実⾏イメージ バイトコードの命令を1⾏ず つ実⾏ 変数の値を読み込んでPush するという命令
値を2つpopし、⾜した結果 をPushするという命令
このスタックは 「オペランドスタック」
メソッドを呼び出すと 「フレーム」が作成されます
「メソッドフレーム」 これもスタック
スタックトレース • ελοΫͷग़ྗ • ϝιουͷݺͼग़͠ͷཤྺ
スタックオーバーフロー • ελοΫͷڐ༰ྔΛ͑Δͱ ʮStackOverflowErrorʯ
スレッド スレッドの中に1つのスタック(メソッ ドフレーム)がある
Javaはマルチスレッド
スレッドダンプ • ͱ͋ΔॠؒͷεϨου(ελοΫͳͲ)ͷঢ়ଶ Λग़ྗͨ͠ͷ • jstack ɾjcmdίϚϯυͰग़ྗ͢Δ͜ͱ͕Ͱ͖ Δ • τϥϒϧൃੜ࣌ͷௐࠪύϑΥʔϚϯεɾ
νϡʔχϯάʹཱͭ
JVMの種類について
JVMには種類がある • JVMͷ༷JavaԾϚγϯ༷ʹΑͬͯن ఆ͞Ε͍ͯΔ͕ɺநత • classϑΝΠϧΛಡΈࠐΜͰਖ਼࣮͘͠ߦͰ ͖ΕOKͰ͋ͱJVMͷ࣮ऀ࣍ୈ • ֤छϕϯμ͕ಠࣗJVMΛఏڙ͍ͯ͠Δ
HotSpotVM • Oracleఏڙ • Ұ൪ϝδϟʔͰɺେମͷਓ͜ΕΛ͍ͬͯ Δഺ • HotSpotͱ͍͏JITίϯύΠϥΛ࠾༻
GraalVM • ͜ΕOracleఏڙ • Graalͱ͍͏JITίϯύΠϥΛ࠾༻͍ͯ͠Δ • RubyPythonͳͲଞݴޠΛ࣮ߦ͢Δػೳ • AOTίϯύΠϧͰͷωΠςΟϒΠϝʔδԽ ͞Ε͍ͯΔ
࠷ۙΑ͘ฉ͘
AOTコンパイル • ࣄલίϯύΠϧ • JITͱҟͳΓɺJVMىಈલʹωΠςΟϒίʔ υ(=OS͕ղऍͰ͖Δίʔυ)ʹίϯύΠϧ • Java9͔Βಋೖ • HotSpotVMͰ࣮ݧతʹ(?)ಋೖ͞Ε͍ͯΔ
ちょっとややこしいけど最近よく名前が出る‧‧‧
JVMのメモリ管理
前提条件 • HotSpot VM Java8 • όʔδϣϯJVMʹΑͬͯࠩҟ͕͋ͬͯ ͍͜͠ͷͰ
JVMのメモリ構造
プログラムで⽣成したオブジェク トはHeapに割り当てられる
None
None
None
None
None
これが「GC」
GC(GarbageCollection) • ·ͣɺෆཁͱͳͬͨΦϒδΣΫτΛ୳͢ɻ • ෆཁͱஅͨ͠ϝϞϦΛղ์͢Δɻ
None
None
None
None
None
None
ヒープのサイズはオプションで 設定することができる % java -Xms600m -Xmx800m -Xloggc:gc.log -XX:+PrintGCDetails -XX: +PrintGCDateStamps
Main -Xms ɾɾɾώʔϓͷॳظαΠζ -Xmx ɾɾɾώʔϓͷ࠷େαΠζ
GCはとてもコストがかかります • GC༻ͷεϨου͕ඞཁ • GCରͷΞϓϦέʔγϣϯεϨουΛࢭΊͯ ͠·͏ GCʹΑΓ࣌ؒΞϓϦέʔγϣϯ͕ࢭ·ΔݱΛ Stop the World
(STW) ͱݺͿ
GCには⾊々なアルゴリズムがある • Mark&Sweep • Copy • ੈผ
GCには⾊々なアルゴリズムがある • Mark&Sweep • Copy • ੈผ これらのアルゴリズムを基本に、各JVMが独⾃でGCを実装している
HotSpotVMのGCの種類 • γϦΞϧܕ • ύϥϨϧܕ • CMS • G1 ※
Java にはShenandoah という新しいGCが実験的に追加されているそうです。 基本はJVM任せでOKだが、 シビアなチューニングが必要な場合は それぞれのメリット‧デメリットを踏まえて選択する。 (スループット重視かレスポンス重視か‧‧‧)
いろいろあるけど 「世代別」が基本となっているので 世代別GCについて説明します
ヒープには「Young領域」と 「Old領域」があります
オブジェクトはまずYoung領域に 作られます
Young領域がいっぱいになってき たら‧‧‧
Young領域だけGCが実⾏されます
これを「マイナーGC」といいます
GCされず、⽣き残った 回数はカウントされます
マイナーGCを繰り返す中でいつまでも 残り「歳をとった」オブジェクトは‧‧‧
Old領域に移動します
もしOld領域もいっぱいになって きた場合‧‧‧
ヒープ全域にGCが⾛ります
これを「メジャー(Full )GC」とい います
実際のプログラムで GCの状況を解析してみる
GCログ • GCͷॲཧ࣌ؒલޙͷϝϞϦ༻ྔͳͲͷϩ ά
GCViewer • GCϩάͷϏϡʔΞʔ • https://github.com/chewiebug/GCViewer • 2019/07/18 ݱࡏɺJDK11ະରԠ
とりあえず、 なんかしら動かして GCログを出してみる
参照が残らないインスタンスを ひたすら⽣成
実⾏ java -Xloggc:gc.log -XX:+PrintGCDetails -XX:+PrintGCDateStamps Main GCϩάग़ྗͷͨΊͷΦϓγϣϯ (※ඪ४ग़ྗʹग़͚ͩ͢Ͱ͋Ε -verbose:gc
͚͚ͩͭΕOK)
出⼒されたログ
GCViewerで開いてみる
ΦϒδΣΫτ·ͣYoungྖҬʹ࡞ΒΕɺ ੜ͔Β͕࣌ؒܦͭͱOldྖҬʹҠಈ͢Δ
ࠓճOldྖҬͷҠಈ͕ൃੜ͠ͳ͍ͨΊ ώʔϓશମͷ༻ྔ ≒ YoungྖҬͷώʔϓ༻ྔ
GC࣌ʹͪΌΜͱϝϞϦ͕ղ์͞Ε͍ͯΔ
ϚΠφʔGCɾɾɾYoungྖҬͷΈ͕ର YoungྖҬ͕ ͍ͬͺ͍ʹͳͬͨ λΠϛϯάͰ ϚΠφʔGC͕ ࣮ߦ͞Ε͍ͯΔ
もう1パターン 試してみる
参照が残るインスタンスを ひたすら⽣成
GCログ
これもGCViewerで開いてみる
None
Full GC (ϝδϟʔGC)ɾɾɾશώʔϓྖҬ͕ର
Full GCは時間がかかる 2019-07-18T07:28:35.759-0900: 53.145: [GC (Allocation Failure) [PSYoungGen: 1153507K->190965K(1768960K)] 1400776K->506242K(2118656K),
0.3026525 secs] [Times: user=2.55 sys=0.14, real=0.31 secs] 2019-07-18T07:28:36.064-0900: 53.450: [Full GC (Ergonomics) [PSYoungGen: 190965K->190932K(1768960K)] [ParOldGe 315276K->290297K(610816K)] 506242K->481229K(2379776K), [Metaspace: 2676K->2676K(1056768K)], 4.7517463 secs] [Times: user=29.92 sys=0.06, real=4.75 secs] ্ͷϚΠφʔGC ɾɾɾ 0.31 secs ԼͷFull GC ɾɾɾ 4.75 secs
ヒープダンプ • ಛఆͷ࣌ࠁʹώʔϓʹؚ·ΕΔͯ͢ͷΦϒ δΣΫτͷεφοϓγϣοτ java -Xms600m -Xmx800m -Xloggc:gc.log -XX:+PrintGCDetails -XX:
+PrintGCDateStamps -XX:+HeapDumpOnOutOfMemoryError Main -XX:+HeapDumpOnOutOfMemoryError ɾɾɾ OOMEൃੜ࣌ʹώʔϓμϯϓΛग़ྗ
まとめ • ීஈͷ։ൃͰ͋·Γҙࣝ͢Δ͜ͱͳ͍͚Ε Ͳɺಛʹӡ༻ϑΣʔζͰԿ͔τϥϒϧ͕ ͋ͬͨ߹ʹɺJVMͷ͜ͷลͷ͕ࣝ͋Δͱ ߄ͯͳͯ͘͢Ή (ଟ)
ご清聴ありがとうござ いました。
参考資料 • JavaԾϚγϯ༷ (The Java series) • ༰͕ݹ͍ͷͰҙ • JavaύϑΥʔϚϯενϡʔχϯά
ୈ2൛ • JavaͷϓϩάϥϜͲ͏ͬͯಈ͍͍ͯΔͷ? JVMฤ https:// www.slideshare.net/skrb/java-jvm • JavaͷϓϩάϥϜͲ͏ͬͯಈ͍͍ͯΔͷ? GCฤ https:// www.slideshare.net/skrb/java-gc-47402594
• OutOfMemoryError ͷௐํ - Qiita https://qiita.com/opengl-8080/ items/64152ee9965441f7667b • JavaͲͷΑ͏ʹಈ͘ͷ͔ʙਤղͰΘ͔ΔJVMͷΈɿ࿈ࡌʛ gihyo.jp
… ٕज़ධࣾ http://gihyo.jp/dev/serial/01/jvm-arc • ʮϝϞϦʔΛҙࣝͯ͠ΈΑ͏ʯୈ2ճɹGCͷΈΛཧղ͢Δ | ܦ xTECHʢΫϩεςοΫʣ https://tech.nikkeibp.co.jp/it/article/ COLUMN/20060612/240657/?rt=nocnt • ·͡ΊʹJVMνϡʔχϯά: ୈ1ճ ·ͣݱঢ়֬ೝ https:// x1.inkenkun.com/archives/367