Upgrade to Pro — share decks privately, control downloads, hide ads and more …

ガベージコレクション(GC)の基礎

 ガベージコレクション(GC)の基礎

オプト社内CS勉強会(第二回)の資料です。ガベージコレクションとは何か、について、馴染みのない向けに基本的な内容を説明したスライドです。

Avatar for Opt Technologies

Opt Technologies

September 27, 2019
Tweet

More Decks by Opt Technologies

Other Decks in Programming

Transcript

  1. 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 ...
  2. 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);
  3. 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);
  4. 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
  5. 完全なメモリリーク判定プログラムは書け 完全なメモリリーク判定プログラムは書け ない ない 「健全かつ完全な」メモリリーク判定関数 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; }
  6. 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
  7. GCがある⾔語でのメモリリーク GCがある⾔語でのメモリリーク ほぼどんな⾔語でも起こる const global = new Object(); console.log("start"); for(leti

    = 0; i < 10000; i++) { console.log(i); } // globalは決して使われないが解放されない console.log("end");