Slide 1

Slide 1 text

How GC works in JavaScript engine 2018-06-26 @ Roppongi.js #4 ariaki

Slide 2

Slide 2 text

No content

Slide 3

Slide 3 text

← Allocated Memory Block

Slide 4

Slide 4 text

No content

Slide 5

Slide 5 text

Out Of Memory

Slide 6

Slide 6 text

rbage Correction G

Slide 7

Slide 7 text

GC: Mark And Sweep 1. 到達可能なオブジェクトにマークする (Mark Phase)

Slide 8

Slide 8 text

2. 不要と判断した領域を回収する (Sweep Phase) GC: Mark And Sweep

Slide 9

Slide 9 text

GC: Mark And Sweep - Incremental GC - Stop-the-World しない - Write Barrier - Memory Fence - Concurrent Marking - Parallel Marking - V8 v6.4 (Chrome 64) でかなり高速化した https://v8project.blogspot.com/2018/06/concurrent-marking.html

Slide 10

Slide 10 text

bject Lifecycle

Slide 11

Slide 11 text

Q1:どんな結果になるでしょう?

Slide 12

Slide 12 text

A1: (1) a=null (2) b=Tue Jun 26 2018 20:00:00 GMT+0900 (日本標準時)

Slide 13

Slide 13 text

【解説】 new Date() Memory var a ( Reference Counter = 1 )

Slide 14

Slide 14 text

【解説】 Memory var a ( Reference Counter = 2 ) var b

Slide 15

Slide 15 text

【解説】 Memory var a ( Reference Counter = 1 ) var b ← 到達可能

Slide 16

Slide 16 text

【解説】 Memory var a ( Reference Counter = 0 ) var b ← 到達不能

Slide 17

Slide 17 text

Q2:どんな結果になるでしょう?

Slide 18

Slide 18 text

A2: (1) a=undefined (2) b=Tue Jun 26 2018 20:00:00 GMT+0900 (日本標準時)

Slide 19

Slide 19 text

Q3:以下のオブジェクトは到達不能?

Slide 20

Slide 20 text

A3: オブジェクトは到達可能

Slide 21

Slide 21 text

【解説】 inner x inner y var a var b var tmp

Slide 22

Slide 22 text

【解説】 inner x inner y var a var b var tmp

Slide 23

Slide 23 text

Q4:以下のオブジェクトは到達不能?

Slide 24

Slide 24 text

A4: オブジェクトは到達不能

Slide 25

Slide 25 text

【解説】 var a var b window

Slide 26

Slide 26 text

【解説】 var a var b window

Slide 27

Slide 27 text

Q5:GCされないオブジェクトはいくつ?

Slide 28

Slide 28 text

A5:5つ

Slide 29

Slide 29 text

【解説】 Javascriptでは「関数オブジェクト」なので忘れやすい。

Slide 30

Slide 30 text

ローカルスコープの変数に代入は不要 ※代入コストがかかるため 書かないことを推奨 【解説】

Slide 31

Slide 31 text

【解説】

Slide 32

Slide 32 text

その他 ※for 文で回す方が大抵 gc よりも低コストになる

Slide 33

Slide 33 text

その他

Slide 34

Slide 34 text

- GC: Mark And Sweep - GC は手動実行できない - root からの到達可能性をチェック - なるべくGCさせない事を意識する - 不要なオブジェクトを生成しない ← タイミングを知る - スコープに注意する - 関数内 var はローカルスコープ - var 指定なしはグローバルスコープ - const / let はブロックスコープ (ES6) - GC対象にするためには - Object に対しては null - Object.property に対しては delete まとめ