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