詳解java垃圾回收機制原理
1.引用計數法(Reference Counting Collector)
1.1算法分析
引用計數是垃圾收集器中的早期策略。在這種方法中,堆中每個對象實例都有一個引用計數。當一個對象被創建時,且將該對象實例分配給一個變量,該變量計數設置為1。當任何其它變量被賦值為這個對象的引用時,計數加1(a = b,則b引用的對象實例的計數器+1),但當一個對象實例的某個引用超過了生命周期或者被設置為一個新值時,對象實例的引用計數器減1。任何引用計數器為0的對象實例可以被當作垃圾收集。當一個對象實例被垃圾收集時,它引用的任何對象實例的引用計數器減1。
1.2優缺點
優點:
引用計數收集器可以很快的執行,交織在程序運行中。對程序需要不被長時間打斷的實時環境比較有利。
缺點:
無法檢測出循環引用。*如父對象有一個對子對象的引用,子對象反過來引用父對象。這樣,他們的引用計數永遠不可能為0.
1.3引用計數算法無法解決循環引用問題,例如:
/** * Java學習交流QQ群:589809992 我們一起學Java! */publicclassMain{publicstaticvoidmain(String[] args) { MyObject object1 = newMyObject(); MyObject object2 = newMyObject(); object1.object = object2; object2.object = object1; object1 = null; object2 = null; } } 最后面兩句將object1和object2賦值為null,也就是說object1和object2指向的對象已經不可能再被訪問,但是由于它們互相引用對方,導致它們的引用計數器都不為0,那么垃圾收集器就永遠不會回收它們。
2.tracing算法(Tracing Collector) 或 標記-清除算法(mark and sweep)
2.1根搜索算法
根搜索算法是從離散數學中的圖論引入的,程序把所有的引用關系看作一張圖,從一個節點GC ROOT開始,尋找對應的引用節點,找到這個節點以后,繼續尋找這個節點的引用節點,當所有的引用節點尋找完畢之后,剩余的節點則被認為是沒有被引用到的節點,即無用的節點。
java中可作為GC Root的對象有
1.虛擬機棧中引用的對象(本地變量表)
2.方法區中靜態屬性引用的對象
3. 方法區中常量引用的對象
4.本地方法棧中引用的對象(Native對象)
2.2tracing算法的示意圖
2.3標記-清除算法分析
標記-清除算法采用從根集合進行掃描,對存活的對象對象標記,標記完畢后,再掃描整個空間中未被標記的對象,進行回收,如上圖所示。標記-清除算法不需要進行對象的移動,并且僅對不存活的對象進行處理,在存活對象比較多的情況下極為高效,但由于標記-清除算法直接回收不存活的對象,因此會造成內存碎片。
非常好我支持^.^
(0) 0%
不好我反對
(0) 0%