分爲兩種:spa
標記清除指針
當變量進入環境時,就將這個變量標記爲「進入環境」。當變量離開環境時,則將其標記爲「離開環境」。code
垃圾收集器在運行的時候會給存儲在內存中的全部變量都加上標記,而後,它會去掉環境中的變量以及被環境中的變量引用的變量的標記。而在此以後再被加上標記的變量將被視爲準備刪除的變量,緣由是環境中的變量已經沒法訪問到這些變量了。最後,垃圾收集器完成內存清除工做。銷燬那些帶標記的值並回收它們所佔用的內存空間。對象
引用計數blog
跟蹤記錄每一個值被引用的次數。當聲明瞭一個變量並將一個引用類型值賦給該變量時,則這個值的引用次數就是1。若是同一個值又被賦給另外一個變量,則該值的引用次數加1。相反,若是包含對這個值的引用的變量又取得了另一個值,則這個值的引用次數減1。當這個值的引用次數變成0時,則說明沒有辦法再訪問這個值了,於是就能夠將其佔用的內存空間收回來。當垃圾收集器下次再運行時,它就會釋放那些引用次數爲0的值所佔用的內存。內存
循環引用:指的是對象A中包含一個指向對象B的指針,而對象B中也包含一個指向對象A的引用。以下:io
function problem(){ var objA = new Object(); var objB = new Object(); objA.someObj = objB; objB.anotherObj = objA; }
爲了不相似的問題,最好是在不使用它們的時候手工斷開之間的鏈接。如:function
objA.someObj = null; objB.anotherObj = null;