版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、Java 中的 中的垃圾回收 垃圾回收與對象 對象生命周期 生命周期1. 垃圾回收 垃圾回收 垃圾回收 垃圾回收是 Java 程序設(shè)計中內(nèi)存管理的核心概念,JVM 的內(nèi)存管理機制被稱為垃圾回收 垃圾回收機制。 一個 一個對象 對象創(chuàng)建后被放置在 創(chuàng)建后被放置在 JVM 的堆內(nèi)存中,當(dāng)永遠不再引用這個 的堆內(nèi)存中,當(dāng)永遠不再引用這個對象 對象時,它將被 時,它將被 JVM 在堆內(nèi)存中回收。被創(chuàng)建的 在堆內(nèi)存中回收。被創(chuàng)建的對象 對象不能再
2、生,同時也沒有辦法通過程 不能再生,同時也沒有辦法通過程序語句釋放它們。即當(dāng) 序語句釋放它們。即當(dāng)對象 對象在 JVM 運行空間中無法通過根集合到達 運行空間中無法通過根集合到達(找到 找到)時,這個 這個對象 對象被稱為垃圾 被稱為垃圾對象 對象。根集合是由類中的靜態(tài)引用域與本地引用域組成的。 。根集合是由類中的靜態(tài)引用域與本地引用域組成的。JVM 通過根集合索引 通過根集合索引對象 對象。 在做 在做 Java 應(yīng)用開發(fā)時經(jīng)常會用到
3、由 應(yīng)用開發(fā)時經(jīng)常會用到由 JVM 管理的兩種類型的內(nèi)存 管理的兩種類型的內(nèi)存:堆內(nèi)存和棧內(nèi)存。簡單來講,堆內(nèi)存主要用來存儲程序在運行時創(chuàng)建或?qū)嵗?堆內(nèi)存和棧內(nèi)存。簡單來講,堆內(nèi)存主要用來存儲程序在運行時創(chuàng)建或?qū)嵗膶ο?對象與變量。例如通過 變量。例如通過 new 關(guān)鍵字創(chuàng)建的 關(guān)鍵字創(chuàng)建的對象 對象。而棧內(nèi)存則是用來存儲程序代碼中聲明為靜態(tài)或非靜態(tài)的方法。 。而棧內(nèi)存則是用來存儲程序代碼中聲明為靜態(tài)或非靜態(tài)的方法。 (1) 堆
4、內(nèi)存 堆內(nèi)存 堆內(nèi)存在 堆內(nèi)存在 JVM 啟動的時候被創(chuàng)建,堆內(nèi)存中所存儲的 啟動的時候被創(chuàng)建,堆內(nèi)存中所存儲的對象 對象可以被 可以被 JVM 自動回收,不能通過其他外部手段回收,也就是說開發(fā)人員無法通過添加相關(guān)代碼 自動回收,不能通過其他外部手段回收,也就是說開發(fā)人員無法通過添加相關(guān)代碼的手段來回收堆內(nèi)存中的 的手段來回收堆內(nèi)存中的對象 對象。堆內(nèi)存通常情況下被分為兩個區(qū)域 。堆內(nèi)存通常情況下被分為兩個區(qū)域:新對象 對象區(qū)域與老 區(qū)
5、域與老對象 對象區(qū)域。 區(qū)域。 新對象 對象區(qū)域 區(qū)域:又可細分為三個小區(qū)域 又可細分為三個小區(qū)域:伊甸園區(qū)域、 伊甸園區(qū)域、From 區(qū)域與 區(qū)域與 To 區(qū)域。伊甸園區(qū)域用來保存新創(chuàng)建的 區(qū)域。伊甸園區(qū)域用來保存新創(chuàng)建的對象 對象,它就像一個堆棧,新的 ,它就像一個堆棧,新的對象 對象被創(chuàng)建,就像 被創(chuàng)建,就像指向該棧的指針在增長一樣,當(dāng)伊甸園區(qū)域中的 指向該棧的指針在增長一樣,當(dāng)伊甸園區(qū)域中的對象 對象滿了之后, 滿了之后,JVM
6、 系統(tǒng)將要做到可達性測試,主要任務(wù)是檢測有哪些 系統(tǒng)將要做到可達性測試,主要任務(wù)是檢測有哪些對象 對象由根集合出發(fā)是不可達的,這些 由根集合出發(fā)是不可達的,這些對象 對象就可以被 就可以被 JVM 回收,并且將所有的活動 回收,并且將所有的活動對象 對象從伊甸園區(qū)域拷貝到 從伊甸園區(qū)域拷貝到 To 區(qū)域,此時一些 區(qū)域,此時一些對象 對象將發(fā)生狀態(tài)交換,有的 將發(fā)生狀態(tài)交換,有的對象 對象就從 就從 To 區(qū)域被轉(zhuǎn)移到 區(qū)域被轉(zhuǎn)移到 F
7、rom 區(qū)域,此時 域,此時 From 區(qū)域就有了 區(qū)域就有了對象 對象。上面 。上面對象 對象遷移的整個過程,都是由 遷移的整個過程,都是由 JVM 控制完成的。 控制完成的。 老對象 對象區(qū)域 區(qū)域:在老 在老對象 對象區(qū)域中的 區(qū)域中的對象 對象仍然會有一個較長的生命周期,大多數(shù)的 仍然會有一個較長的生命周期,大多數(shù)的 JVM 系統(tǒng)垃圾 系統(tǒng)垃圾對象 對象,都是源于 ,都是源于“短命 短命“對象 對象,經(jīng)過一段時間后,被轉(zhuǎn)入老 ,
8、經(jīng)過一段時間后,被轉(zhuǎn)入老對象 對象區(qū)域的 區(qū)域的對象 對象,就變成了垃圾 ,就變成了垃圾對象 對象。此時,它們都被打上相應(yīng)的標(biāo)記, 。此時,它們都被打上相應(yīng)的標(biāo)記,JVM 系統(tǒng)將會自動回收這些垃圾 系統(tǒng)將會自動回收這些垃圾對象 對象,建議不要頻繁地 ,建議不要頻繁地強制 強制系統(tǒng)作垃圾回收,這是因為 系統(tǒng)作垃圾回收,這是因為JVM 會利用有限的系統(tǒng)資源,優(yōu)先完成垃圾回收工作,導(dǎo)致應(yīng)用無法快速地響應(yīng)來自用戶端的請求,這樣會影響系統(tǒng)的整體性
9、能。 會利用有限的系統(tǒng)資源,優(yōu)先完成垃圾回收工作,導(dǎo)致應(yīng)用無法快速地響應(yīng)來自用戶端的請求,這樣會影響系統(tǒng)的整體性能。 (2) 棧內(nèi)存 棧內(nèi)存 堆內(nèi)存主要用來存儲程序在運行時創(chuàng)建或?qū)嵗膶ο笈c變量。例如通過 new 關(guān)鍵字創(chuàng)建的對象。而棧內(nèi)存則是用來存儲程序代碼中聲明為靜態(tài)或非靜態(tài)的方法。 2. JVM 中對象的生命周期 中對象的生命周期 在 JVM 運行空間中,對象的整個生命周期大致可以分為 7 個階段: 創(chuàng)建階段 創(chuàng)建階段; 應(yīng)用階
10、段 應(yīng)用階段; 不可視階段 不可視階段; 不可到達階段 不可到達階段; 可收集階段 可收集階段; 終結(jié)階段 終結(jié)階段; 釋放階段 釋放階段 SoftReference sr = new SoftReference(a); a = null; ... // 下次使用時 if (sr != null) {a = sr.get();} else { // GC 由于低內(nèi)存,已釋放 a,因此需要重新裝載a = new A(); sr = ne
11、w SoftReference(a);}軟引用技術(shù)的引進使 Java 應(yīng)用可以更好地管理內(nèi)存,穩(wěn)定系統(tǒng),防止系統(tǒng)內(nèi)存溢出,避免系統(tǒng)崩潰。因此在處理一些占用內(nèi)存較大且生命周期較長,但使用并不繁地對象時應(yīng)盡量應(yīng)用該技術(shù)。提高系統(tǒng)穩(wěn)定性。 弱引用 弱引用(Weak Reference):弱應(yīng)用對象與軟引用對象的最大不同就在于 弱應(yīng)用對象與軟引用對象的最大不同就在于:GC 在進行垃圾回收時,需要通過算法檢查是否回收 在進行垃圾回收時,需要通過算
12、法檢查是否回收 Soft 應(yīng)用對象,而對于 應(yīng)用對象,而對于Weak 引用, 引用,GC 總是進行回收。 總是進行回收。Weak 引用對象更容易、更快地被 引用對象更容易、更快地被 GC 回收。 回收。Weak 引用對象常常用于 引用對象常常用于 Map 結(jié)構(gòu)中。 結(jié)構(gòu)中。import java.lang.ref.WeakReference;4. ...5. 6. A a = new A();7. ...8.9. // 使用 a10.
13、... 11.12. // 使用完了 a, 將它設(shè)置為 Weak 引用類型,并且釋放強引用 13. WeakReference wr = new WeakReference(a); 14. a = null;15. ... 16.17. // 下次使用時 18. if (wr != null) { 19. a = wr.get();20. } else { 21. a = new A();22. wr = new WeakReferen
14、ce(a); 23. }虛引用 虛引用(Phantom Reference): 虛引用的用途較少,主要用于輔助 虛引用的用途較少,主要用于輔助 finalize 函數(shù)的使用。 函數(shù)的使用。 虛引用 虛引用(Phantom Reference)對象指一些執(zhí)行完了 對象指一些執(zhí)行完了 finalize 函數(shù),并為不可達對象,但是還沒有被 函數(shù),并為不可達對象,但是還沒有被 GC 回收的對象。這種對象可以輔助 回收的對象。這種對象可以輔助 f
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- java中的垃圾回收與對象生命周期
- java生命周期
- 企業(yè)形象生命周期模型構(gòu)建.pdf
- 企業(yè)生命周期與薪酬設(shè)計企業(yè)生命周期與薪酬設(shè)計
- 生命周期評價與生命周期成本的集成與優(yōu)化研究.pdf
- 動物的生命周期
- .net 生命周期
- 我們的生命周期
- 人體生命周期
- 測試生命周期
- 畢業(yè)論文-論述軟件開發(fā)生命周期與測試生命周期
- 企業(yè)生命周期與薪酬設(shè)計
- 垃圾滲濾液對玉米生命周期的毒效應(yīng)研究.pdf
- 旅游地生命周期特點及延長生命周期的對策
- ppp全生命周期
- 產(chǎn)品生命周期理論
- 軟件測試生命周期
- 組織生命周期理論
- 其他動物的生命周期
- 產(chǎn)品的生命周期理論
評論
0/150
提交評論