Slide 1

Slide 1 text

Java, Go, Rustのメモリ管理⼿法の⽐較 和⽥ 隆道 JJUG CCC 2025 Spring 2025/06/07

Slide 2

Slide 2 text

1 © LY Corporation 和⽥ 隆道 Wada Takamichi LINEヤフー株式会社 コマースカンパニー SC統括本部 開発本部 #LINEギフトのサーバーサイドエンジニア #新卒3年⽬ 前回のJJUGでも発表しました︕ 新卒2年⽬エンジニアがLINEギフトの保守 性を⾼めるために取り組んだこと

Slide 3

Slide 3 text

Todayʼs Agenda 2 © LY Corporation 1. メモリの役割 2. Java, Go, Rustのメモリ管理⼿法 3. 負荷テストでパフォーマンス⽐較

Slide 4

Slide 4 text

発表の動機 © LY Corporation 3 l 普段の業務ではJavaを、ISUCONではGoを使っていたが、メモリがどのように管理されてい るか意識することは少なかった。GCを使っていることは知ってる l また、最近流⾏りのRustはGCがないらしい。どういうこと︖ l それぞれどのようにメモリ管理してるのか、それはどのようにパフォーマンスに影響するの か、知りたい︕ ⾔語ごとにメモリ管理⼿法がどのように異なるのか知りたい

Slide 5

Slide 5 text

伝えたいこと © LY Corporation 4 ⾔語ごとにメモリ管理⼿法が様々で⾯⽩い︕アツい︕ l Java: 世代別GC l Go: エスケープ解析とシンプルなGC l Rust: Ownershipで管理してGC不要

Slide 6

Slide 6 text

Todayʼs Agenda 5 © LY Corporation 1. メモリの役割 2. Java, Go, Rustのメモリ管理⼿法 3. 負荷テストでパフォーマンス⽐較

Slide 7

Slide 7 text

メモリの役割 © LY Corporation 6 レジスタ キャッシュメモリ メインメモリ 2次記憶装置 プログラム 変数 速度 容量 ⾼速 低速 ⼤容量 低容量

Slide 8

Slide 8 text

メモリの構造 © LY Corporation 7 テキスト領域 静的領域 ヒープ領域 スタック領域 ︓プログラムを格納する領域 ︓グローバル変数や静的変数を格納する領域 ︓動的に割り当てられる領域 ︓関数の引数・ローカル変数・戻り値を格納する領域

Slide 9

Slide 9 text

メモリの構造 © LY Corporation 8 テキスト領域 静的領域 ヒープ領域 スタック領域 ︓プログラムを格納する領域 ︓グローバル変数や静的変数を格納する領域 ︓動的に割り当てられる領域 ︓関数の引数・ローカル変数・戻り値を格納する領域 ヒープとスタックの管理⼿法は⾔語によって様々であり パフォーマンスへの影響が⼤きい

Slide 10

Slide 10 text

Todayʼs Agenda 9 © LY Corporation 1. メモリの役割 2. Java, Go, Rustのメモリ管理⼿法 3. 負荷テストでパフォーマンス⽐較

Slide 11

Slide 11 text

Todayʼs Agenda 10 © LY Corporation 1. メモリの役割 2. Java, Go, Rustのメモリ管理⼿法 3. 負荷テストでパフォーマンス⽐較

Slide 12

Slide 12 text

Java: スタックとヒープの管理⼿法 © LY Corporation 11 スタック ヒープ

Slide 13

Slide 13 text

スタック ヒープ Java: スタックとヒープの管理⼿法 © LY Corporation 12 personFnction main args

Slide 14

Slide 14 text

スタック ヒープ Java: スタックとヒープの管理⼿法 © LY Corporation 13 main args

Slide 15

Slide 15 text

スタック ヒープ Java: スタックとヒープの管理⼿法 © LY Corporation 14 printAlice main args

Slide 16

Slide 16 text

スタック ヒープ Java: スタックとヒープの管理⼿法 © LY Corporation 15 printAlice main args

Slide 17

Slide 17 text

スタック ヒープ Java: スタックとヒープの管理⼿法 © LY Corporation 16 Alice name age Alice 26 オブジェクトは基本的にヒープに割り当てられる printAlice main args

Slide 18

Slide 18 text

スタック ヒープ Java: スタックとヒープの管理⼿法 © LY Corporation 17 Alice name age Alice 26 オブジェクトは基本的にヒープに割り当てられる printAlice alice main args

Slide 19

Slide 19 text

スタック ヒープ Java: スタックとヒープの管理⼿法 © LY Corporation 18 Alice name age Alice 26 printAlice alice main args

Slide 20

Slide 20 text

スタック ヒープ Java: スタックとヒープの管理⼿法 © LY Corporation 19 Alice name age Alice 26 printAlice alice main args

Slide 21

Slide 21 text

スタック ヒープ Java: スタックとヒープの管理⼿法 © LY Corporation 20 personFunction ヒープにオブジェクトが残る Alice name age Alice 26 main args

Slide 22

Slide 22 text

スタック ヒープ Java: スタックとヒープの管理⼿法 © LY Corporation 21 Alice name age Alice 26 main args

Slide 23

Slide 23 text

スタック ヒープ Java: スタックとヒープの管理⼿法 © LY Corporation 22 Alice name age Alice 26 returnBob main args

Slide 24

Slide 24 text

スタック ヒープ Java: スタックとヒープの管理⼿法 © LY Corporation 23 Alice name age Alice 26 returnBob main args

Slide 25

Slide 25 text

スタック ヒープ Java: スタックとヒープの管理⼿法 © LY Corporation 24 Bob name age Bob 22 オブジェクトは基本的にヒープに割り当てられる Alice name age Alice 26 returnBob main args

Slide 26

Slide 26 text

スタック ヒープ Java: スタックとヒープの管理⼿法 © LY Corporation 25 Bob name age Bob 22 オブジェクトは基本的にヒープに割り当てられる Alice name age Alice 26 returnBob bob main args

Slide 27

Slide 27 text

スタック ヒープ Java: スタックとヒープの管理⼿法 © LY Corporation 26 Bob name age Bob 22 Alice name age Alice 26 returnBob bob main args

Slide 28

Slide 28 text

スタック ヒープ Java: スタックとヒープの管理⼿法 © LY Corporation 27 main args Bob name age Bob 22 Alice name age Alice 26 returnBob bob

Slide 29

Slide 29 text

スタック ヒープ Java: スタックとヒープの管理⼿法 © LY Corporation 28 main args Bob name age Bob 22 Alice name age Alice 26 returnBob bob

Slide 30

Slide 30 text

スタック ヒープ Java: スタックとヒープの管理⼿法 © LY Corporation 29 main args Bob name age Bob 22 Alice name age Alice 26

Slide 31

Slide 31 text

スタック ヒープ Java: スタックとヒープの管理⼿法 © LY Corporation 30 main p args Bob name age Bob 22 Alice name age Alice 26

Slide 32

Slide 32 text

スタック ヒープ Java: スタックとヒープの管理⼿法 © LY Corporation 31 main p args Bob name age Bob 22 Alice name age Alice 26

Slide 33

Slide 33 text

スタック ヒープ Java: スタックとヒープの管理⼿法 © LY Corporation 32 main p args Bob name age Bob 22 Alice name age Alice 26

Slide 34

Slide 34 text

スタック ヒープ Java: スタックとヒープの管理⼿法 © LY Corporation 33 main p args Bob name age Bob 22 Alice name age Alice 26

Slide 35

Slide 35 text

スタック ヒープ Java: スタックとヒープの管理⼿法 © LY Corporation 34 Bob name age Bob 22 Alice name age Alice 26

Slide 36

Slide 36 text

Java: スタックとヒープの管理⼿法 © LY Corporation 35 スタック ヒープ ヒープに参照されないオブジェクトが残る→Garbage Collection(GC)が必要 Bob name age Bob 22 Alice name age Alice 26

Slide 37

Slide 37 text

Java: スタックとヒープの管理⼿法 © LY Corporation 36 スタック ヒープ ヒープに参照されないオブジェクトが残る→Garbage Collection(GC)が必要 Bob name age Bob 22 Alice name age Alice 26

Slide 38

Slide 38 text

ヒープ Java: Garbage Collection(GC) © LY Corporation 37 スタック object object object object object var ⽬的はヒープの不要なオブジェクトを解放すること

Slide 39

Slide 39 text

ヒープ Java: Garbage Collection(GC) © LY Corporation 38 スタック object object object object object スタックの変数からオブジェクトの参照を辿る var

Slide 40

Slide 40 text

ヒープ Java: Garbage Collection(GC) © LY Corporation 39 スタック object object object object object スタックの変数からオブジェクトの参照を辿る var

Slide 41

Slide 41 text

ヒープ Java: Garbage Collection(GC) © LY Corporation 40 スタック object object object object object スタックの変数からオブジェクトの参照を辿る var

Slide 42

Slide 42 text

ヒープ Java: Garbage Collection(GC) © LY Corporation 41 スタック object object object object object スタックの変数からオブジェクトの参照を辿る var

Slide 43

Slide 43 text

ヒープ Java: Garbage Collection(GC) © LY Corporation 42 スタック object object object object object 参照のないオブジェクトがある var

Slide 44

Slide 44 text

ヒープ Java: Garbage Collection(GC) © LY Corporation 43 スタック object object object object object 参照のないオブジェクトがある→解放する var

Slide 45

Slide 45 text

ヒープ Java: Garbage Collection(GC) © LY Corporation 44 スタック object object object object object var 参照のないオブジェクトがある→解放する

Slide 46

Slide 46 text

ヒープ Java: Garbage Collection(GC) © LY Corporation 45 スタック object object object var 参照のないオブジェクトがある→解放する

Slide 47

Slide 47 text

ヒープ Java: Garbage Collection(GC) © LY Corporation 46 スタック object object object var また、Javaでは世代別という⼯夫を⽤いてGCを効率化している

Slide 48

Slide 48 text

Java:世代別GCによる効率化 © LY Corporation 47 Eden Old Survivor Survivor ヒープを固定サイズのリージョンに分割して管理する ✱ Java9以降でデフォルトのG1GCについて説明

Slide 49

Slide 49 text

Java:世代別GCによる効率化 © LY Corporation 48 Eden Old Survivor Survivor object object オブジェクトはリージョンに割り当てられる ✱ Java9以降でデフォルトのG1GCについて説明

Slide 50

Slide 50 text

Java:世代別GCによる効率化 © LY Corporation 49 Eden Eden Old Survivor Survivor リージョンは⽣存期間に基づいて世代に分類される ✱ Java9以降でデフォルトのG1GCについて説明 Eden Survivor Old

Slide 51

Slide 51 text

Java:世代別GCによる効率化 © LY Corporation 50 Eden Eden Old Survivor Survivor 若いリージョンを優先的にGCする(世代別GC) ✱ Java9以降でデフォルトのG1GCについて説明 Eden Survivor Old

Slide 52

Slide 52 text

Java:世代別GCによる効率化 © LY Corporation 51 Old Eden Eden Survivor Survivor 若いリージョンを優先的にGCする(世代別GC) Eden Survivor Old

Slide 53

Slide 53 text

Survivor Java:世代別GCによる効率化 © LY Corporation 52 Old Eden Eden Survivor Survivor 不要オブジェクトを解放し、⽣存するオブジェクトはリージョンに集約する Eden Survivor Old

Slide 54

Slide 54 text

Java:世代別GCによる効率化 © LY Corporation 53 Old Survivor Survivor Survivor 不要オブジェクトを解放し、⽣存するオブジェクトはリージョンに集約する Eden Survivor Old

Slide 55

Slide 55 text

Java:世代別GCによる効率化 © LY Corporation 54 ⼤部分のオブジェクトは短命であるという特性を利⽤することで効率化 ✱ Java9以降でデフォルトのG1GCについて説明 ⼤部分のオブジェクトは短命[1]

Slide 56

Slide 56 text

Javaのメモリ管理⼿法: まとめ © LY Corporation 55 l オブジェクトは基本的にヒープに割り当てられる l 不要になったオブジェクトを解放するためにGCを⾏う l 若いオブジェクトを優先的にGCすることで効率化(世代別GC) 世代別GCで効率的に不要オブジェクトを解放

Slide 57

Slide 57 text

スタック ヒープ Java:オブジェクトの割り当て⼿法 © LY Corporation 56 Bob name age Bob 22 Alice name age Alice 26 Bob alice オブジェクトは基本的にヒープに割り当てられる

Slide 58

Slide 58 text

Go:オブジェクトの割り当て⼿法 © LY Corporation 57 スタック ヒープ Alice name old Alice 26 alice bob エスケープ解析でスタックとヒープのどちらに割り当てるか決める Bob name old Bob 22 ✱ JavaでもJITコンパイラで実⾏時にエスケープ解析するがGoほど積極的には働いていない

Slide 59

Slide 59 text

Go: スタックとヒープの管理⼿法 © LY Corporation 58 スタック ヒープ

Slide 60

Slide 60 text

Go: スタックとヒープの管理⼿法 © LY Corporation 59 スタック ヒープ main

Slide 61

Slide 61 text

Go: スタックとヒープの管理⼿法 © LY Corporation 60 スタック ヒープ main

Slide 62

Slide 62 text

Go: スタックとヒープの管理⼿法 © LY Corporation 61 スタック ヒープ printAlice main

Slide 63

Slide 63 text

Go: スタックとヒープの管理⼿法 © LY Corporation 62 スタック ヒープ printAlice main

Slide 64

Slide 64 text

Go: スタックとヒープの管理⼿法 © LY Corporation 63 スコープからエスケープしないオブジェクトはスタックに割り当てる スタック ヒープ printAlice main Alice name age Alice 26

Slide 65

Slide 65 text

Go: スタックとヒープの管理⼿法 © LY Corporation 64 スコープからエスケープしないオブジェクトはスタックに割り当てる スタック ヒープ printAlice alice main Alice name age Alice 26

Slide 66

Slide 66 text

スタック ヒープ Go: スタックとヒープの管理⼿法 © LY Corporation 65 printAlice alice スコープからエスケープしないオブジェクトはスタックに割り当てる main Alice name age Alice 26

Slide 67

Slide 67 text

Go: スタックとヒープの管理⼿法 © LY Corporation 66 スタック ヒープ printAlice alice main Alice name age Alice 26

Slide 68

Slide 68 text

Go: スタックとヒープの管理⼿法 © LY Corporation 67 スタック ヒープ printAlice alice main Alice name age Alice 26

Slide 69

Slide 69 text

Go: スタックとヒープの管理⼿法 © LY Corporation 68 スタック ヒープ main

Slide 70

Slide 70 text

Go: スタックとヒープの管理⼿法 © LY Corporation 69 スタック ヒープ main

Slide 71

Slide 71 text

Go: スタックとヒープの管理⼿法 © LY Corporation 70 スタック ヒープ main returnBob

Slide 72

Slide 72 text

Go: スタックとヒープの管理⼿法 © LY Corporation 71 スタック ヒープ main returnBob

Slide 73

Slide 73 text

スタック ヒープ main Go: スタックとヒープの管理⼿法 © LY Corporation 72 returnBob スコープからエスケープするオブジェクトはヒープに割り当てる ✱ 実際にはインライン化によりエスケープしない扱いになってスタックに置かれることもある

Slide 74

Slide 74 text

スタック ヒープ main returnBob Go: スタックとヒープの管理⼿法 © LY Corporation 73 Bob name age Bob 22 スコープからエスケープするオブジェクトはヒープに割り当てる

Slide 75

Slide 75 text

スタック ヒープ main returnBob Go: スタックとヒープの管理⼿法 © LY Corporation 74 bob スコープからエスケープするオブジェクトはヒープに割り当てる Bob name age Bob 22

Slide 76

Slide 76 text

Go: スタックとヒープの管理⼿法 © LY Corporation 75 スタック ヒープ main returnBob bob Bob name age Bob 22

Slide 77

Slide 77 text

Go: スタックとヒープの管理⼿法 © LY Corporation 76 スタック ヒープ main returnBob bob Bob name age Bob 22

Slide 78

Slide 78 text

Go: スタックとヒープの管理⼿法 © LY Corporation 77 スタック ヒープ main p Bob name age Bob 22

Slide 79

Slide 79 text

Go: スタックとヒープの管理⼿法 © LY Corporation 78 スタック ヒープ main p Bob name age Bob 22

Slide 80

Slide 80 text

Go: スタックとヒープの管理⼿法 © LY Corporation 79 スタック ヒープ main p Bob name age Bob 22

Slide 81

Slide 81 text

Go: スタックとヒープの管理⼿法 © LY Corporation 80 スタック ヒープ Bob name age Bob 22

Slide 82

Slide 82 text

Go: スタックとヒープの管理⼿法 © LY Corporation 81 ヒープに残るオブジェクトの数は少ない スタック ヒープ Bob name age Bob 22

Slide 83

Slide 83 text

Go: スタックとヒープの管理⼿法 © LY Corporation 82 ヒープに残るオブジェクトの数は少ない→世代別を⾏わないシンプルなGC スタック ヒープ Bob name age Bob 22

Slide 84

Slide 84 text

Goのメモリ管理⼿法: まとめ © LY Corporation 83 エスケープ解析とシンプルなGC l エスケープ解析でオブジェクトをスタックとヒープのどちらに割り当てるか決める l ヒープに残るオブジェクトの数は少ない l 世代別を⾏わないシンプルなGC

Slide 85

Slide 85 text

Rust: スタックとヒープの管理⼿法 © LY Corporation 84 スタック ヒープ

Slide 86

Slide 86 text

Rust: スタックとヒープの管理⼿法 © LY Corporation 85 スタック ヒープ main

Slide 87

Slide 87 text

Rust: スタックとヒープの管理⼿法 © LY Corporation 86 スタック ヒープ main

Slide 88

Slide 88 text

スタック ヒープ Rust: スタックとヒープの管理⼿法 © LY Corporation 87 main printAlice

Slide 89

Slide 89 text

スタック ヒープ Rust: スタックとヒープの管理⼿法 © LY Corporation 88 main Alice name age Alice 26 printAlice ヒープにオブジェクトを割り当てる ✱ サイズ固定のオブジェクトはスタックに割り当てられるがOwnershipの説明のために単純化

Slide 90

Slide 90 text

スタック ヒープ Rust: スタックとヒープの管理⼿法 © LY Corporation 89 printAlice alice ヒープにオブジェクトを割り当てる ✱ サイズ固定のオブジェクトはスタックに割り当てられるがOwnershipの説明のために単純化 main Alice name age Alice 26

Slide 91

Slide 91 text

スタック ヒープ Rust: スタックとヒープの管理⼿法 © LY Corporation 90 printAlice alice オブジェクトのOwnershipを変数aliceが持つ ✱ サイズ固定のオブジェクトはスタックに割り当てられるがOwnershipの説明のために単純化 main Alice name age Alice 26

Slide 92

Slide 92 text

スタック ヒープ Rust: スタックとヒープの管理⼿法 © LY Corporation 91 printAlice alice オブジェクトのOwnershipを変数aliceが持つ ✱ サイズ固定のオブジェクトはスタックに割り当てられるがOwnershipの説明のために単純化 main Alice name age Alice 26

Slide 93

Slide 93 text

スタック ヒープ Rust: スタックとヒープの管理⼿法 © LY Corporation 92 printAlice alice オブジェクトのOwnershipを変数aliceが持つ ✱ サイズ固定のオブジェクトはスタックに割り当てられるがOwnershipの説明のために単純化 main Alice name age Alice 26

Slide 94

Slide 94 text

スタック ヒープ Rust: スタックとヒープの管理⼿法 © LY Corporation 93 printAlice alice 変数aliceが解放される ✱ サイズ固定のオブジェクトはスタックに割り当てられるがOwnershipの説明のために単純化 main Alice name age Alice 26

Slide 95

Slide 95 text

Rust: スタックとヒープの管理⼿法 © LY Corporation 94 変数aliceが解放される スタック ヒープ ✱ サイズ固定のオブジェクトはスタックに割り当てられるがOwnershipの説明のために単純化 printAlice alice main Alice name age Alice 26

Slide 96

Slide 96 text

Rust: スタックとヒープの管理⼿法 © LY Corporation 95 変数aliceが解放される→Ownershipを持つオブジェクトも解放される スタック ヒープ ✱ サイズ固定のオブジェクトはスタックに割り当てられるがOwnershipの説明のために単純化 Alice name age Alice 26 printAlice alice main

Slide 97

Slide 97 text

Rust: スタックとヒープの管理⼿法 © LY Corporation 96 変数aliceが解放される→Ownershipを持つオブジェクトも解放される スタック ヒープ ✱ サイズ固定のオブジェクトはスタックに割り当てられるがOwnershipの説明のために単純化 main

Slide 98

Slide 98 text

Rust: スタックとヒープの管理⼿法 © LY Corporation 97 スタック ヒープ ✱ サイズ固定のオブジェクトはスタックに割り当てられるがOwnershipの説明のために単純化 main

Slide 99

Slide 99 text

スタック ヒープ Rust: スタックとヒープの管理⼿法 © LY Corporation 98 returnBob ✱ サイズ固定のオブジェクトはスタックに割り当てられるがOwnershipの説明のために単純化 main

Slide 100

Slide 100 text

スタック ヒープ Rust: スタックとヒープの管理⼿法 © LY Corporation 99 Bob name age Bob 22 returnBob ✱ サイズ固定のオブジェクトはスタックに割り当てられるがOwnershipの説明のために単純化 ヒープにオブジェクトを割り当てる main

Slide 101

Slide 101 text

スタック ヒープ Rust: スタックとヒープの管理⼿法 © LY Corporation 100 returnBob bob ✱ サイズ固定のオブジェクトはスタックに割り当てられるがOwnershipの説明のために単純化 main Bob name age Bob 22 ヒープにオブジェクトを割り当てる

Slide 102

Slide 102 text

スタック ヒープ Rust: スタックとヒープの管理⼿法 © LY Corporation 101 returnBob bob ✱ サイズ固定のオブジェクトはスタックに割り当てられるがOwnershipの説明のために単純化 オブジェクトのOwnershipを変数bobが持つ main Bob name age Bob 22

Slide 103

Slide 103 text

スタック ヒープ Rust: スタックとヒープの管理⼿法 © LY Corporation 102 ✱ サイズ固定のオブジェクトはスタックに割り当てられるがOwnershipの説明のために単純化 オブジェクトのOwnershipを変数bobが持つ main Bob name age Bob 22 returnBob bob

Slide 104

Slide 104 text

スタック ヒープ Rust: スタックとヒープの管理⼿法 © LY Corporation 103 ✱ サイズ固定のオブジェクトはスタックに割り当てられるがOwnershipの説明のために単純化 オブジェクトのOwnershipを変数bobが持つ main Bob name age Bob 22 returnBob bob

Slide 105

Slide 105 text

スタック ヒープ Rust: スタックとヒープの管理⼿法 © LY Corporation 104 main p ✱ サイズ固定のオブジェクトはスタックに割り当てられるがOwnershipの説明のために単純化 オブジェクトのOwnershipが移動する Bob name age Bob 22

Slide 106

Slide 106 text

スタック ヒープ Rust: スタックとヒープの管理⼿法 © LY Corporation 105 main p ✱ サイズ固定のオブジェクトはスタックに割り当てられるがOwnershipの説明のために単純化 オブジェクトのOwnershipが移動する Bob name age Bob 22

Slide 107

Slide 107 text

スタック ヒープ Rust: スタックとヒープの管理⼿法 © LY Corporation 106 main p ✱ サイズ固定のオブジェクトはスタックに割り当てられるがOwnershipの説明のために単純化 オブジェクトのOwnershipが移動する Bob name age Bob 22

Slide 108

Slide 108 text

スタック ヒープ Rust: スタックとヒープの管理⼿法 © LY Corporation 107 main p ✱ サイズ固定のオブジェクトはスタックに割り当てられるがOwnershipの説明のために単純化 変数pが解放される Bob name age Bob 22

Slide 109

Slide 109 text

スタック ヒープ Rust: スタックとヒープの管理⼿法 © LY Corporation 108 main p ✱ サイズ固定のオブジェクトはスタックに割り当てられるがOwnershipの説明のために単純化 変数pが解放される Bob name age Bob 22

Slide 110

Slide 110 text

スタック ヒープ Rust: スタックとヒープの管理⼿法 © LY Corporation 109 main Bob name age Bob 22 p ✱ サイズ固定のオブジェクトはスタックに割り当てられるがOwnershipの説明のために単純化 変数pが解放される→Ownershipを持つオブジェクトも解放される

Slide 111

Slide 111 text

スタック ヒープ Rust: スタックとヒープの管理⼿法 © LY Corporation 110 ✱ サイズ固定のオブジェクトはスタックに割り当てられるがOwnershipの説明のために単純化 変数pが解放される→Ownershipを持つオブジェクトも解放される

Slide 112

Slide 112 text

スタック ヒープ Rust: スタックとヒープの管理⼿法 © LY Corporation 111 ✱ サイズ固定のオブジェクトはスタックに割り当てられるがOwnershipの説明のために単純化 ヒープにオブジェクトが残らない

Slide 113

Slide 113 text

スタック ヒープ Rust: スタックとヒープの管理⼿法 © LY Corporation 112 ✱ サイズ固定のオブジェクトはスタックに割り当てられるがOwnershipの説明のために単純化 ヒープにオブジェクトが残らない→GCが不要

Slide 114

Slide 114 text

Rustのメモリ管理⼿法: まとめ © LY Corporation 113 ヒープをOwnershipで管理する l Ownershipを持った変数と⼀緒にヒープのオブジェクトも解放される l GCを⾏わずにヒープを管理することができる

Slide 115

Slide 115 text

Java, Go, Rustのメモリ管理⼿法: まとめ © LY Corporation 114 それぞれ異なる⼿法でメモリを管理している l Java: 世代別GC l Go: エスケープ解析とシンプルなGC l Rust: Ownershipで管理してGC不要

Slide 116

Slide 116 text

Todayʼs Agenda 11 © LY Corporation 1. メモリの役割 2. Java, Go, Rustのメモリ管理⼿法 3. 負荷テストでパフォーマンス⽐較

Slide 117

Slide 117 text

負荷テストの概要 © LY Corporation 116 1KBのオブジェクトを1万個⽣成する関数(createObjects)の実⾏時間を⽐較する l ⽬的: メモリ管理⼿法の違いがパフォーマンスにどう影響するか⽐較すること l 設定: createObjectsを1000回実⾏する(メモリ8GB、CPU2コア) l 指標: createObjectsの実⾏時間

Slide 118

Slide 118 text

実⾏するコード © LY Corporation 117 createObjectsを1000回実⾏する Javaのコード(Go, Rustも同様)

Slide 119

Slide 119 text

Javaの結果 © LY Corporation 118 定期的にスパイクが⽴っている

Slide 120

Slide 120 text

Javaの結果 © LY Corporation 119 ヒープを⼤量に使っているため、GCが頻繁に実⾏される GCのタイミングでStop The Worldが発⽣してスパイクが⽴つ

Slide 121

Slide 121 text

Goの結果 © LY Corporation 120 エスケープ解析によってヒープを使わないためGCは0回 スタックはオーバーヘッドが⼩さいので実⾏時間はほぼ⼀定

Slide 122

Slide 122 text

Rustの結果 © LY Corporation 121 ヒープを使っているがOwnershipで管理してるのでGCは無し ヒープはオーバーヘッドがあるので実⾏時間は少しばらつく

Slide 123

Slide 123 text

箱ひげ図 © LY Corporation 122 分布特性はそれぞれ異なるが、中央値・平均値はどの⾔語も⼤きく変わらない ✱ JavaはJITコンパイラで実⾏時に最適化されるため外れ値があるので99%tileで集計

Slide 124

Slide 124 text

まとめ © LY Corporation 123 l Javaは世代別GC、Goはエスケープ解析とシンプルなGC、RustはOwnershipでGC不要 l 負荷テストでは、JavaはGCでスパイクが⽴つ、Goはヒープを使わないのでほぼ⼀定、 Rustは安定しているがヒープを使うので少しばらつく、と⾔う結果だった l ⼀⽅で、それぞれ最適化の余地は⼗分にあるし、設定によって結果も変動する l Java: JVMパラメータ調整、他のGCアルゴリズム、JITコンパイラが効くように実装 l Go: (ヒープ使ってるなら)スタック使うように実装、GCパラメータ調整、アリーナ l Rust: スタック使うように実装、メモリアロケータの選択 それぞれ異なる⼿法でメモリを管理している それによってパフォーマンスの特性が異なることも確認できた

Slide 125

Slide 125 text

参考⽂献 © LY Corporation 124 1. ORACLE ガベージ・コレクション・チューニング・ガイド 2. Garbage First Garbage Collection (G1 GC) #jjug_ccc #ccc_cd6 3. Visualizing memory management in JVM(Java, Kotlin, Scala, Groovy, Clojure) 4. Go⾔語のGCについて - LINE Engineering 5. Getting to Go: The Journey of Goʻs Garbage Collector – The Go Blog 6. The Rust Programming Language

Slide 126

Slide 126 text

終わり © LY Corporation 125 ご清聴ありがとうございました︕

Slide 127

Slide 127 text

Appendix: JavaのGCログ © LY Corporation 126 起動時 GC実⾏時

Slide 128

Slide 128 text

Appendix: GoのGCログ(説明に使ったものとは別のプログラム) © LY Corporation 127 GC実⾏時

Slide 129

Slide 129 text

Appendix: 箱ひげ図(100%tile) © LY Corporation 128