方法區的垃圾回收
方法區的的垃圾收集主要包括兩個部分:
- 廢棄的常量:不可達的常量。
- 無用的類。
無用的類需要滿足下列三個條件:
- 該類所有的例項已經被回收。
- 該類對應的 Class 物件不可達。
- 載入該類的 ClassLoder 已經被回收
注意:上述條件中的 ClassLoder 是例項,而不是其對應的 Class 物件。
圖示如下:
【應用:熱部署】
熱部署就是在執行時更新位元組碼檔案。
如何進行熱部署?
使用一個新的 ClassLoder 載入更新的 class 檔案。可以使用監聽器,檢測到檔案變動時,掃描到新的 ClassLoder,呼叫其相關方法載入更新類。
PS:ClassLoder 不能重複載入同一個 class 檔案。
但是,如果某個舊類的例項無法被回收,比如雜湊表中持有了這個物件,就會造成用記憶體洩漏,方法區記憶體堆積也會引起記憶體溢位。而且類的體系被打亂了,記憶體中無法被回收的類的例項,與其同名類的例項(新建立),因其 ClassLoder 不同,將永遠不會 equals。