Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
ガベージコレクション(GC)の基礎
Search
Opt Technologies
September 27, 2019
Programming
96
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
ガベージコレクション(GC)の基礎
オプト社内CS勉強会(第二回)の資料です。ガベージコレクションとは何か、について、馴染みのない向けに基本的な内容を説明したスライドです。
Opt Technologies
September 27, 2019
More Decks by Opt Technologies
See All by Opt Technologies
LL(1)構文解析の紹介
opttechnologies
0
480
Other Decks in Programming
See All in Programming
UnityでSystem.Net.WebSocketsなWebSocketサーバが動かないのでUnity Monoのコードを覗いてみた / about implementing websocket server with unity mono
drumath2237
1
610
Findy - エンジニア向け会社紹介/Findy Company Deck
findyinc
6
400k
最近”作らせてる” ローカルAIアプリの話
akit37
0
470
コードレビューのボトルネックを"する側"と"される側"の両面から解消する
yub0n
2
1.6k
【加筆修正版】Laravel のアプリケーションをどこにデプロイするか #phpcon_ehime
akase244
0
150
[2026-09-26]空論ジェネリックプロセス~テスト資産とAIで紡ぐ、再現可能なパフォーマンスチューニングの話~
tosite
0
270
Unity6 URPによる海底をテーマにしたVJシステムの解説 | Unity Shader 完全に理解した 勉強会
gam0022
0
370
The Rails Doctrine Decade
koic
2
590
残高管理から台帳サービスへの進化
artoy
1
200
UPDATE をやめる — EF Core でマスタをバージョン管理する
panda728
PRO
0
1.2k
動作中のプログラムの中身をリアルタイムに覗く / Realtime Debugger for CSharp with Roslyn
prota
1
1.9k
Web Framework Benchmark Battle 2026, Any%
a_matsuda
2
2k
Featured
See All Featured
HDC tutorial
michielstock
2
960
Are puppies a ranking factor?
jonoalderson
2
4.1k
Amusing Abliteration
ianozsvald
1
350
Chasing Engaging Ingredients in Design
codingconduct
0
360
The browser strikes back
jonoalderson
0
1.8k
Public Speaking Without Barfing On Your Shoes - THAT 2023
reverentgeek
1
600
Marketing Yourself as an Engineer | Alaka | Gurzu
gurzu
0
330
Future Trends and Review - Lecture 12 - Web Technologies (1019888BNR)
signer
PRO
0
3.8k
Getting science done with accelerated Python computing platforms
jacobtomlinson
2
540
Game over? The fight for quality and originality in the time of robots
wayneb77
1
300
ReactJS: Keep Simple. Everything can be a component!
pedronauck
666
130k
How to optimise 3,500 product descriptions for ecommerce in one day using ChatGPT
katarinadahlin
PRO
3
3.9k
Transcript
ガベージコレクション(GC)の基礎 ガベージコレクション(GC)の基礎 CTO室 CTO室 ⽔島 宏太 ⽔島 宏太
⾃⼰紹介 ⾃⼰紹介 Twitter ID: GitHub: 社内でもkmizu 趣味: プログラミング⾔語|形式⾔語の⾃作 , etc.
@kmizu kmizu Onion Klassic Macro PEG
発表の構成 発表の構成 「当たり前」のGC GCの無い世界 完全な⾃動メモリ管理の不可能性 GCの基礎 参照カウント⽅式 マーク&スウィープ⽅式 より⾼度なGC 参考書籍
お願い お願い 発表の途中でも遠慮なく質問してください
「当たり前」のGC 「当たり前」のGC
GCは普通 GCは普通 現代の⾔語ではGCが無い⽅が少数派 Python, Ruby, Java, Scala, Go, etc. ⼀部の⾔語ではGCが無い
Rust, C(++)など システムプログラミングのため
GCサンプルコード GCサンプルコード 以下のJavaScriptプログラムは動作し続ける メモリが⾜りなくなることは無い GCがnew Object()で作ったメモリを回収する while(true) { const x
= new Object(); }
GCサンプルコード GCサンプルコード 以下のJavaScriptプログラムは死ぬ const buffer = [] while(true) { buffer.push(1);
} <--- Last few GCs ---> [2860:0x103003200] 938 ms: Scavenge 1148.7 (1181.9) -> 1148.7 (1 [2860:0x103003200] 1524 ms: Mark-sweep 1722.5 (1755.7) -> 1693.1 ...
GCサンプルコード(循環参照あり) GCサンプルコード(循環参照あり) 以下のJavaScriptプログラムも動作し続ける VBAとかPerlでは死ぬ class Ring { constructor(value, next) {
this.value = value; this.next = next; } } while(true) { const r = new Ring(1, null); r.next = r; //循環した参照 }
GCサンプルコード(循環参照あり) GCサンプルコード(循環参照あり) Excel VBA on macOS ぐんぐんメモリ消費量が増える GUIが固まる危険性があります さっき試した '
Ring.cls Public Link as Variant Dim p as Variant While 1 Set p = new Ring Set p.Link = p Wend
GCの無い世界 GCの無い世界
Cで動的バッファを作る Cで動的バッファを作る /* バッファを新規生成 */ Buffer* Buffer_new(void); /* バッファに要素を追加 */
void Buffer_append(Buffer* self, int content); /* バッファから要素を取り出す */ int Buffer_get(Buffer* self, int index); /* バッファに要素を設定 */ void Buffer_set(Buffer* self, int index, int content); /* バッファを解放 */ void Buffer_free(Buffer* self);
Cで動的バッファを使ってみる Cで動的バッファを使ってみる /* バッファを生成 */ Buffer* buffer = Buffer_new(); /*
10を追加 */ Buffer_append(buffer, 10); /* 10が表示される */ printf("%d\n", Buffer_get(buffer, 0)); /* 0番目に20を設定 */ Buffer_set(buffer, 0, 20); /* 20が表示される */ printf("%d\n", Buffer_get(buffer, 0)); /* バッファを解放 */ Buffer_free(buffer);
Cで動的バッファを解放し忘れてみる Cで動的バッファを解放し忘れてみる エラーが発⽣ 確保された領域が解放されないため メモリーリーク while(1) { Buffer* buf =
Buffer_new(); } $ ./buffer ... *** error: can't allocate region *** set a breakpoint in malloc_error_break to debug buffer(57390,0x7fffa9cff380) malloc: *** mach_vm_map(size=40001536) f
Cプログラミングの難しさ Cプログラミングの難しさ メモリ安全でない GCが無い ⼿動で確保した領域を解放する必要 処理系がいい感じでメモリを管理して欲しい︕ or メモリリークがあるか判定して欲しい︕
脇道: Boehm GC 脇道: Boehm GC C⾔語⽤のGCライブラリ GC_MALLOC() で確保した領域をGCしてくれる 以下のプログラムが死なない
https://en.wikipedia.org/wiki/Boehm_garbage_collector while(1) { char *p = GC_malloc(1000000); }
完全な⾃動メモリ管理 完全な⾃動メモリ管理 プログラムの不可能性 プログラムの不可能性
完全なメモリリーク判定プログラムは書け 完全なメモリリーク判定プログラムは書け ない ない 「健全かつ完全な」メモリリーク判定関数 has_memory_leak が書けると仮定する has_memory_leak が書けると⽭盾するので書けない int
has_memory_leak(char* program, char* input) void run(char* program, char* input) { if(has_memory_leak(program, input)) { return; } else { /*メモリリークが発生しないはずなのにする!*/ malloc(sizeof(int)); } } int main(char** input) { run(to_string(run), input[0]); return 0; }
完全なメモリ解放処理挿⼊プログラムも書 完全なメモリ解放処理挿⼊プログラムも書 けない けない has_memory_leak が書けないのと同じ理屈 こういう問題を決定不能 (undecidable) と呼ぶ 決定不能な問題(で有⽤なもの)は凄く多い
⾊々な型チェックに関する問題 System F<: DOT計算 ,etc. ウイルスが⼊っているかを判定する ⽂脈⾃由以上の⾔語に関する様々な判定問題 , etc.
決定不能問題の取り扱い 決定不能問題の取り扱い 現実的な解法(1): 保守的(conservative)な解法 いくらかメモリ解放処理を挿⼊し忘れてもいい 本来型がついて欲しいプログラムのいくつかには型 が付かない 現実的な解法(2): ヒューリスティクス ウイルス検知プログラム
誤検知も⾒逃しもあるが、精度はそれなり
GCの基礎 GCの基礎
GCの保守性 GCの保守性 GCはいい感じに不要なメモリを解放してくれる GCは保守的(conservative) 必要なオブジェクトを絶対に解放しない 不要なオブジェクトを解放し忘れることがある GCがある⾔語でも「メモリリーク」はある 本来の「メモリリーク」と意味が違うが
GC: なぜ動く︖ GC: なぜ動く︖ 変数からオブジェクトのつながりを追跡できればいい let x = new Object();
x = null; x Object x Object
参照カウント⽅式 参照カウント⽅式 オブジェクトにカウンタを持たせる いくつの変数から指されているか カウントが0になれば解放可能
let x = new Object(); x Object[count=1] let y =
x; x Object[count=2] y y = null; x = null; x Object[count=0] y
参照カウント⽅式の限界 参照カウント⽅式の限界 参照が循環すると詰む let x = new Ring(1, null); x.next
= x; x = null; x Ring[count=1]
参照カウント⽅式の利点 参照カウント⽅式の利点 実装が簡単 オブジェクトにカウンタを埋め込む カウンタを上下させる GCによる停⽌が(あまり)発⽣しない
参照カウント⽅式の⾔語処理系 参照カウント⽅式の⾔語処理系 ⾔語仕様でGC⽅式が決まっているわけではない Javaで参照カウント⽅式のGCも仕様上はOK 昔のMicroso JVMがそうだった記憶(曖昧) Perl 5 VBA VB
6までも同様 Swi , Objective-C ARC (Automatic Reference Counting) Python マーク&スウィープ⽅式と併⽤
マーク&スウィープ⽅式 マーク&スウィープ⽅式 スタックやレジスタ上にある変数を管理 ルートセット と呼ばれる ルートセットから到達可能なオブジェクトのみが⽣き ている それ以外は回収可能
ホワイトボードによる説明 ホワイトボードによる説明 var x = new Ring(1, null); var y
= x; x.next = x; x = null; y = null;
マーク&スウィープ⽅式の利点 マーク&スウィープ⽅式の利点 参照が循環していてもいい OOPとかFPではよくある 参照カウント⽅式よりも性能がいい(ことが多い) スループット VS. レイテンシ
マーク&スウィープ⽅式の⽋点 マーク&スウィープ⽅式の⽋点 GCのための停⽌時間が⻑くなることがある オブジェクトのグラフをたどるため 参照カウント⽅式だと短い 処理系がスタックやレジスタ上の変数を管理する必要
より⾼度なGC より⾼度なGC 世代別GC 管理領域を複数に分割する 並列GC たどりや掃除を並列に⾏う その他⾊々
GCがある⾔語でのメモリリーク GCがある⾔語でのメモリリーク ほぼどんな⾔語でも起こる const global = new Object(); console.log("start"); for(leti
= 0; i < 10000; i++) { console.log(i); } // globalは決して使われないが解放されない console.log("end");
より⾼度な話題へ より⾼度な話題へ
質問タイム 質問タイム どんどん質問してください