JavaScript Memory Management Masterclass のメモ
JavaScript Memory Management Masterclass // Speaker Deckのメモです。
Q. メモリリークはどうやってチェックするの?
A. DevToolsでSnapshotsを取って比較
Hidden Classes
V8にはHidden Classesがあるので、delete
するのは最適化を逆に妨げる。
Closures
循環参照によるリーク
DOM Leak
DOMツリーは親を消しても、子のどれかを保持してる場合は、
そのツリーはGCによって回収されないので、
子もちゃんとnullなどして回収されるようにしないといけない。
Timers
ES6 WeakMaps
WeakMapsはメモリリークを避けるために必要。
普通にオブジェクトを使うと強参照になるので、GCで回収されない。
Memory Checklist
- 不必要なDOM elementへの強参照を避ける
- 循環参照を避ける
- 適切なスコープを使う
- 必要なくなったevent listenersは解除する
- ローカルキャッシュを管理する
- 管理する事で古いオブジェクトを捨てる
メモリ管理の基礎
Core Concepts
- 値の型は何?
- メモリ上で値はどうやって管理されてる?
- garbadgeって何?
- leakって何?
garbadgeって何?
Garbageとはroot nodeから辿りつけない値達の事
garbage collection はそれらのgarbageをシステムに伝える事
memory leakって何?
JavaScript DOM node
JavaScriptからDOM nodeへの参照を持っていると、
そのnodeをDOMから消しても、JavaScriptの参照があるためリークする
(JavaScript側からの参照を消せば回収される)
V8 memory management
new
や暗黙的にメモリをallocationする- Memory poolを使い切るとGCが走る
- GCにはmillisecondsかかる
- メモリのallocation気をつけないとGCによるフリーズが起きる
V8は世代別GC
- Young valueとOld Valueに値は分けられる
- 一定時間経つとyoung valueはoldに送られる
young generation
- fast allocation
- fast collection
- よくcollect(GC?)される
old generation
- fast allocation
- solower collection
- たまにcollectされる
なぜ、young generationは fast collection なのかというのは、
GCのコストはlive objectsの数に比例するため、
live obejctsが多いyoungのcollectionは早くないといけない。
Performance Tools
performance.memory
jsHeapSizeLimit
: heap sizeのlimittotalJSHeapSize
: 今使ってるheap sizeusedJSHeapSize
: allocated,free spaceを含んだsize
DevToolsの解説
Closures には名前付き関数式を使ったほうが見やすい
どうやってメモリリークを見つけるか
- Open DevTools
- Snapshot #1
- 操作
- Snapshot #2
- 操作
- Snapshot #2
- #1と#2のallocatedを比較する
Object Allocation Tracker
Allocation Stack Traces
JavaScriptの処理のビジュアライズ
ProfileをChartで見るとFlame Chart Viewで見られる
リソース紹介
- Overview - Google Chrome
- v8-perf
- Writing Fast, Memory-Efficient JavaScript | Smashing Magazine
- Fix two memory leaks + subtle bugs in Edit's JS (discovered by working on the Backbone upgrade in the D7 backport) [#2159965] | Drupal.org
- Tech Tuesday: Avoiding a memory leak situation in JS – Imgur Blog
- StrongLoop | Node.js Performance Tip of the Week: Memory Leak Diagnosis