垃圾回收器如何肯定哪些對象要回收:
引用計數法java
不少教科書判斷對象是否存活的算法是這樣的:給對象添加一個引用計數器,每當有一個地發引用它時,計數器值就加1;當引用失效時,計數器值就減1;任什麼時候刻計數器都爲0的對象就是不可能再被使用的。算法
客觀地說,引用技術算法的實現簡單,斷定效率也很高,在大部分狀況下它都是一個不錯的算法,也有一些比較著名的應用案例,例如微軟的COM技術、使用ActionScript 3 的FlashPlayer、Python語言以及在遊戲腳本領域中被普遍應用的Squirrel中都使用了引用計數算法進行內存管理。可是java語言中沒有選用,其中最主要的緣由是它很難解決對象之間的相互循環引用的問題。c#
根搜索算法ui
在主流的商用程序語言中(java和c#),都是使用根搜索算法(GC Roots Tracing)判斷對象是否存活的。這個算法的基本思路就是經過一系列的名爲「GC Roots」的對象做爲起始點,從這些節點開始向下搜索,搜索所走過的路徑稱爲引用鏈(Reference Chain),當一個對象到GC Roots沒有任何引用鏈相連(用圖論的話來講就是從GC Roots到這個對象不可達)時,則證實此對象是不可用的。 spa
在java語言裏可做爲GC Roots的對象包括下面幾種:
虛擬機棧(棧幀中的本地變量表)中的引用對象。對象
方法區中的類靜態屬性引用的對象。遊戲
方法區中的常量引用的對象。ip
本地方法棧中JNI(即Native方法)的引用的對象。
內存