图灵学院VIP课程第五期学习笔记
1.引用計數法:
每個對象有一個引用計數屬性,新增一個引用的時候計數加1,引用釋放時計數減1,當計數為0的時候就可以回收
2.可達性分析法:
從 GC Roots 開始向下搜索,搜索所走過的路徑稱為引用鏈。當一個對象到 GCRoots 沒有任何引用鏈相連時,則證明此對象是不可用的,那么虛擬機就判斷是可回收對象。
但是這樣會存在一個問題:
引用計數法,可能會出現A 引用了 B,B 又引用了 A,這時候就算他們都不再使用了,但因為相互
引用 計數器=1 ,那這兩個對象就都永遠無法被回收。
解決:
只靠強引用計數方式,會存在循環引用的問題,導致對象永遠無法被釋放,弱引用就是專門用來解決循環引用問題的:
若 A 強引用了 B,那 B 引用 A 時就需使用弱引用,當判斷是否為無用對象時僅考慮強引用計數是否為 0,不關心弱引用計數的數量
這樣就解決了循環引用導致對象無法釋放的問題,但這會引發野指針問題:當 B 要通過弱指針訪問 A 時,A 可能已經被銷毀了,那指向 A 的這個弱指針就變成野指針了。在這種情況下,就表示 A 確實已經不存在了,需要進行重新創建等其他操作
3.GC Roots解釋
GC Roots的對象有:
虛擬機棧(棧幀中的本地變量表)中引用的對象
方法區中類靜態屬性引用的對象
方法區中常量引用的對象
本地方法棧中JNI(即一般說的Native方法)引用的對象
可達性算法中的不可達對象并不是立即死亡的,對象擁有一次自我拯救的機會。對象被系統宣告死亡至
少要經歷兩次標記過程:第一次是經過可達性分析發現沒有與GC Roots相連接的引用鏈,第二次是在由
虛擬機自動建立的Finalizer隊列中判斷是否需要執行finalize()方法。
當對象變成(GC Roots)不可達時,GC會判斷該對象是否覆蓋了finalize方法,若未覆蓋,則直接將其回
收。否則,若對象未執行過finalize方法,將其放入F-Queue隊列,由一低優先級線程執行該隊列中對象
的finalize方法。執行finalize方法完畢后,GC會再次判斷該對象是否可達,若不可達,則進行回收,否
則,對象“復活”
總結
以上是生活随笔為你收集整理的图灵学院VIP课程第五期学习笔记的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: vxlan Virtual eXtens
- 下一篇: 转载:Windows的进程创建和映像装入