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
14k
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
2.1k
私が考える理想の開発チーム
sammy7th
0
680
ビジネスルールを軸とした ソフトウェア開発手法 「CCSR」
sammy7th
7
2.6k
お家に居れなくなって 3週間ゲストハウス暮らしをしていた話
sammy7th
2
510
家で仕事中にインターフォンに気づかず困っているのでIoTでなんとかしたい
sammy7th
1
200
ホットサンドメーカーで作るスイーツ
sammy7th
0
300
Udemyでプログラミング の動画講座を販売してみた
sammy7th
1
890
Git運用基礎
sammy7th
1
290
エンジニア向け合同説明会「就活GeekHub」イベント説明
sammy7th
1
2.9k
Other Decks in Technology
See All in Technology
Oracle Database@Azure:サービス概要のご紹介
oracle4engineer
PRO
3
350
Kusakabe_面白いダッシュボードの表現方法
ykka
0
120
ソフトとハード両方いけるデータ人材の育て方
waiwai2111
0
140
コミュニティが持つ「学びと成長の場」としての作用 / RSGT2026
ama_ch
0
230
困ったCSVファイルの話
mottyzzz
0
190
kintone開発のプラットフォームエンジニアの紹介
cybozuinsideout
PRO
0
510
AI Agent Standards and Protocols: a Walkthrough of MCP, A2A, and more...
glaforge
0
210
Java 25に至る道
skrb
3
210
2025年の医用画像AI/AI×medical_imaging_in_2025_generated_by_AI
tdys13
0
330
Introduction to Sansan, inc / Sansan Global Development Center, Inc.
sansan33
PRO
0
2.9k
人工知能のための哲学塾 ニューロフィロソフィ篇 第零夜 「ニューロフィロソフィとは何か?」
miyayou
0
440
「駆動」って言葉、なんかカッコイイ_Mitz
comucal
PRO
0
140
Featured
See All Featured
Measuring Dark Social's Impact On Conversion and Attribution
stephenakadiri
1
100
ラッコキーワード サービス紹介資料
rakko
0
2M
From π to Pie charts
rasagy
0
110
Claude Code のすすめ
schroneko
67
210k
The Invisible Side of Design
smashingmag
302
51k
Hiding What from Whom? A Critical Review of the History of Programming languages for Music
tomoyanonymous
1
350
Avoiding the “Bad Training, Faster” Trap in the Age of AI
tmiket
0
51
Put a Button on it: Removing Barriers to Going Fast.
kastner
60
4.1k
The browser strikes back
jonoalderson
0
300
Utilizing Notion as your number one productivity tool
mfonobong
2
200
Heart Work Chapter 1 - Part 1
lfama
PRO
4
35k
Information Architects: The Missing Link in Design Systems
soysaucechin
0
740
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