1. 垃圾回收
JVM運行環境中垃圾對象的定義:
一個對象創建后被放置在JVM的堆內存(heap)中,當永遠不再引用這個對象時,它將被JVM在堆內存(heap)中回收。被創建的對象不能再生,同時也沒法通過程序語句釋放它們。
不可到達的對象被JVM視為垃圾對象,JVM將給這些對象打上標記,然后清掃回收它們,并將散碎的內存單元收集整合。
JVM管理的兩種類型的內存:
堆內存(heap),主要存儲程序在運行時創建或實例化的對象與變量。
棧內存(stack),主要存儲程序代碼中聲明為靜態(static)(或非靜態)的方法。
堆內存(heap)通常情況下被分為兩個區域:新對象(new object)區域與老對象(old object)區域。
新對象區域:
又可細分為Eden區域、From區域與To區域。
Eden區域保存新創建的對象。當該區域中的對象滿了后,JVM系統將做可達性測試,主要任務是檢測有哪些對象由根集合出發是不可到達的,這些對象就可被JVM回收,且將所有的活動對象從Eden區域拷到To區域,此時有一些對象將發生狀態交換,有的對象就從To區域被轉移到From區域,此時From區域就有了對象。
該過程執行期間,JVM的性能非常低下,會嚴重影響到正在運行的應用的性能。
老對象區域:
在老對象區域中的對象仍有一個較長的生命周期。經過一段時間后,被轉入
tb老對象區域的對象就變成了垃圾對象,此時它們被打上相應的標記,JVM將自動回收它們。
建議不要頻繁強制系統做垃圾回收,因為JVM會利用有限的系統資源,優先完成垃圾回收工作,致使應用無法快速響應來自用戶端的請求,這樣會影響系統的整體性能。
2. JVM中對象的生命周期
對象的整個生命周期大致分為7個階段:創建(creation)、應用(using)、不可視(invisible)、不可到達(unreachable)、可收集(collected)、終結(finalized)、釋放(free)。
1) 創建階段
系統通過下面步驟,完成對象的創建:
a) 為對象分配存儲空間
b) 開始構造對象
c) 遞歸調用其超類的構造方法
d) 進行對象實例初始化與變量初始化
e) 執行構造方法體
在創建對象時的幾個關鍵應用規則:
避免在循環體中創建對象,即使該對象占用內存空間不大
盡量及時使對象符合垃圾回收標準
不要采用過深的繼承層次
訪問本地變量優于訪問類中的變量