介紹
低層次的語言,如C,具有低階的記憶體管理指令,如:malloc()和free(),需要開發者手動釋放記憶體。然而像javascript這樣的高階語言情況則不同,物件(objects, strings 等)創建的時候分配內存,當他們不在使用的時候內存會被自動回收,這個自動回收的過程被稱為垃圾回收。因為垃圾回收的存在,讓javascript等高階語言開發者產生了一個錯誤的認識,以為可以不用關心記憶體管理。
記憶體生命週期
不管什麼樣的程式語言,記憶體的生命週期基本上是一致的。
1.分配你需要的記憶體
2.使用他進行讀寫操作
3.記憶體不需要的時候,釋放資源
步驟1和步驟2對所有語言都一樣,能明顯覺察到。至於步驟3,低階語言需要開發者明確執行。而對於像javascript這樣的高階語言,這部分操作是交給解析器完成的,所以你不會覺察到。
javascript中的分配操作
值的初始化
在為變數賦值的時候,javascript會完成記憶體的分配工作。
透過函數呼叫完成分配
對值的使用,其實也就是對分配後的記憶體執行讀寫操作。這些操作包括:對變數或物件的屬性進行讀寫操作,或是向函數傳遞參數。
當不再需要的時候,釋放記憶體
絕大多數的記憶體管理問題都發生在這個階段。最難做的事情是,如何判定分配的記憶體不再需要。這往往需要開發者做出判定,程式在什麼時候不再需要內存,並釋放他所佔資源。
高階語言的解析器中嵌入了一個叫做「垃圾收集器」的程序,他的工作是用來追蹤記憶體的分配和使用,判定記憶體是否被需要,在不再需要的時候執行資源釋放操作。他只能得到一個近似值,因為判斷一個記憶體是否被需要,這是個不確定的問題(不能用一種演算法解決)。
垃圾回收
如上文所述,我們無法準確的做到自動判定「記憶體不再需要」。所以,垃圾回收對該問題的解決方案有其限制。本節將解釋必要的概念,以了解主要的垃圾收集演算法和它們的限制。
引用
垃圾回收中一個主要的概念是引用。在記憶體管理中,當一個物件無論是顯式的還是隱式的使用了另一個對象,我們就說他引用了另一個對象。例如,javascript物件存在一個隱式的指向原型的引用,還有明確指向他的屬性值的引用。
在這裡,物件的概念超越了javascript傳統意義上物件的概念,他還包括函數作用域和全域作用域。
使用引用計數演算法的垃圾回收
下面要介紹的是一種最理想化的演算法,引入了 “物件不再需要” 和 “沒有其他物件引用該物件” 的概念。當該物件的引用指標變成0的時候,就認為他可以被回收。
範例:
ie6、7中,在dom物件上使用引用計數的演算法,這裡會存在記憶體洩漏的問題。
彼は、「不要になったオブジェクト」と「到達不能なオブジェクト(オブジェクト到達不能)」という概念を導入しました。このアルゴリズムは、一連のルート オブジェクトが存在することを前提としています (JavaScript のルート オブジェクトはグローバル オブジェクトです)。ガベージ コレクターはルート オブジェクトから開始し、参照するすべてのオブジェクトを走査し、次に、ルート オブジェクトを走査します。参照オブジェクトによって参照されるオブジェクトなど。このアプローチを使用すると、ガベージ コレクターはアクセス可能なすべてのオブジェクトを取得し、アクセスできないオブジェクトを再利用できます。
このアルゴリズムは、0 によって参照されるオブジェクトがアクセス不可能なオブジェクトとして設定されると同時に、循環参照によって引き起こされる問題も回避します。
2012 年現在、ほとんどの最新ブラウザはこの「マーク アンド スイープ」ガベージ コレクターを使用しています。 JavaScript のガベージ コレクション (世代別/増分/同時/並列ガベージ コレクション) の分野は、ここ数年でそれに関連するアルゴリズムが改良されてきましたが、ガベージ コレクションのアルゴリズムそのもの (マークスイープ アルゴリズム) や「オブジェクトかどうかを判断する方法」は、はもう必要ありません」は改善されていません。
生理周期はもう問題ではありません
最初の例では、関数呼び出しが終了すると、これら 2 つのオブジェクトはグローバル オブジェクトによって参照されなくなり、グローバル オブジェクトによって参照されるオブジェクトからも参照されなくなります。したがって、これらは JavaScript ガベージ コレクターによってアクセス不可能なオブジェクトとしてマークされます。 2 番目の例でも同じことが起こり、div とイベント ハンドラーがガベージ コレクターによってアクセス不能としてマークされると、それらは解放されます。
制限事項: オブジェクトは明示的にアクセス不可としてマークする必要があります
このマーキング方法には制限がありますが、プログラミングでこの方法に触れたことがないため、ガベージ コレクション関連のコンテンツについてはほとんど気にしません。