JVM學習(一)

1.引用計數算法
JVM爲每個對象設立一個引用計數器,當存在一個地方引用對象的時候,引用計數器值加1。當引用計數器值爲0時,表示該對象不會被使用。
弊端:無法解決對象之間相互循環引用的問題。

2.可達性分析算法
該算法的基本思路:將“GC Roots”對象作爲起始點,當一個對象到GC Roots沒有任何“引用鏈”時,該對象就是不可用。
可作爲GC Roots對象的種類:

  • 虛擬機棧(局部變量表)中引用的對象
  • 本地方法棧中JNI引用的對象
  • 方法區中的類靜態屬性引用的對象
  • 方法區中的常量引用的對象

3.四種引用類型

  1. 強引用(StrongReference):就是指在代碼塊中明顯存在的,類似於:Object o = new Object();只要強引用還存在,GC就不會回收這類對象
  2. 軟引用(SoftReference):軟引用是指那些有用的但不是必需的對象。當系統內存不足的情況下,將此類對象列到回收範圍內進行第二次回收
  3. 弱引用(WeakReference):描述非必需對象。生命週期在下一次GC之前。不管當前系統內存是否充足,下一次垃圾收集器工作時一定會回收。
  4. 虛引用(PhantomReference):也稱爲幽靈引用或者幻影引用。它不影響對象的生命週期。爲一個對象設置虛引用的目的僅僅是當被回收時會收到一個系統通知。

4.對象生存還是死亡?
即使在可達性分析中不可達的對象,也不是非死不可的。如果對象要真正死亡,要經歷兩次標記。如果對象不可達,進行第一個標記並且篩選。篩選的標準是“對象是否有必要執行finalize()方法”。如果對象沒有覆蓋finalize()方法或者finalize()方法已經被JVM調用過,則視爲不需要執行finalize方法。
如果對象被判定爲需要執行,則把它放入到一個F-Queue的隊列中,稍後由一個虛擬機自己建立的Finalizer()線程執行。
finalize()方法是對象逃離死亡的最後一次機會,稍後GC將會對F-Queue隊列中的對象第二次標記,如果對象在finalize()方法中拯救自己——對象與引用鏈上的任何一個對象關聯起來,比如對象將自己賦值給類變量或者給一個對象的成員變量;那麼此對象將會被移除隊列不會被回收。

5.“無用的類”的3個條件

  1. Java堆中不存在該類的任何實例
  2. 加載該類的ClassLoader已經被回收
  3. 該類對應的java.lang.Class對象在任何地方沒有被引用,無法在任何地方通過反射訪問該類的方法
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章