2023年全國(guó)碩士研究生考試考研英語一試題真題(含答案詳解+作文范文)_第1頁(yè)
已閱讀1頁(yè),還剩3頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、Java 中的 中的垃圾回收 垃圾回收與對(duì)象 對(duì)象生命周期 生命周期1. 垃圾回收 垃圾回收 垃圾回收 垃圾回收是 Java 程序設(shè)計(jì)中內(nèi)存管理的核心概念,JVM 的內(nèi)存管理機(jī)制被稱為垃圾回收 垃圾回收機(jī)制。 一個(gè) 一個(gè)對(duì)象 對(duì)象創(chuàng)建后被放置在 創(chuàng)建后被放置在 JVM 的堆內(nèi)存中,當(dāng)永遠(yuǎn)不再引用這個(gè) 的堆內(nèi)存中,當(dāng)永遠(yuǎn)不再引用這個(gè)對(duì)象 對(duì)象時(shí),它將被 時(shí),它將被 JVM 在堆內(nèi)存中回收。被創(chuàng)建的 在堆內(nèi)存中回收。被創(chuàng)建的對(duì)象 對(duì)象不能再

2、生,同時(shí)也沒有辦法通過程 不能再生,同時(shí)也沒有辦法通過程序語句釋放它們。即當(dāng) 序語句釋放它們。即當(dāng)對(duì)象 對(duì)象在 JVM 運(yùn)行空間中無法通過根集合到達(dá) 運(yùn)行空間中無法通過根集合到達(dá)(找到 找到)時(shí),這個(gè) 這個(gè)對(duì)象 對(duì)象被稱為垃圾 被稱為垃圾對(duì)象 對(duì)象。根集合是由類中的靜態(tài)引用域與本地引用域組成的。 。根集合是由類中的靜態(tài)引用域與本地引用域組成的。JVM 通過根集合索引 通過根集合索引對(duì)象 對(duì)象。 在做 在做 Java 應(yīng)用開發(fā)時(shí)經(jīng)常會(huì)用到

3、由 應(yīng)用開發(fā)時(shí)經(jīng)常會(huì)用到由 JVM 管理的兩種類型的內(nèi)存 管理的兩種類型的內(nèi)存:堆內(nèi)存和棧內(nèi)存。簡(jiǎn)單來講,堆內(nèi)存主要用來存儲(chǔ)程序在運(yùn)行時(shí)創(chuàng)建或?qū)嵗?堆內(nèi)存和棧內(nèi)存。簡(jiǎn)單來講,堆內(nèi)存主要用來存儲(chǔ)程序在運(yùn)行時(shí)創(chuàng)建或?qū)嵗膶?duì)象 對(duì)象與變量。例如通過 變量。例如通過 new 關(guān)鍵字創(chuàng)建的 關(guān)鍵字創(chuàng)建的對(duì)象 對(duì)象。而棧內(nèi)存則是用來存儲(chǔ)程序代碼中聲明為靜態(tài)或非靜態(tài)的方法。 。而棧內(nèi)存則是用來存儲(chǔ)程序代碼中聲明為靜態(tài)或非靜態(tài)的方法。 (1) 堆

4、內(nèi)存 堆內(nèi)存 堆內(nèi)存在 堆內(nèi)存在 JVM 啟動(dòng)的時(shí)候被創(chuàng)建,堆內(nèi)存中所存儲(chǔ)的 啟動(dòng)的時(shí)候被創(chuàng)建,堆內(nèi)存中所存儲(chǔ)的對(duì)象 對(duì)象可以被 可以被 JVM 自動(dòng)回收,不能通過其他外部手段回收,也就是說開發(fā)人員無法通過添加相關(guān)代碼 自動(dòng)回收,不能通過其他外部手段回收,也就是說開發(fā)人員無法通過添加相關(guān)代碼的手段來回收堆內(nèi)存中的 的手段來回收堆內(nèi)存中的對(duì)象 對(duì)象。堆內(nèi)存通常情況下被分為兩個(gè)區(qū)域 。堆內(nèi)存通常情況下被分為兩個(gè)區(qū)域:新對(duì)象 對(duì)象區(qū)域與老 區(qū)

5、域與老對(duì)象 對(duì)象區(qū)域。 區(qū)域。 新對(duì)象 對(duì)象區(qū)域 區(qū)域:又可細(xì)分為三個(gè)小區(qū)域 又可細(xì)分為三個(gè)小區(qū)域:伊甸園區(qū)域、 伊甸園區(qū)域、From 區(qū)域與 區(qū)域與 To 區(qū)域。伊甸園區(qū)域用來保存新創(chuàng)建的 區(qū)域。伊甸園區(qū)域用來保存新創(chuàng)建的對(duì)象 對(duì)象,它就像一個(gè)堆棧,新的 ,它就像一個(gè)堆棧,新的對(duì)象 對(duì)象被創(chuàng)建,就像 被創(chuàng)建,就像指向該棧的指針在增長(zhǎng)一樣,當(dāng)伊甸園區(qū)域中的 指向該棧的指針在增長(zhǎng)一樣,當(dāng)伊甸園區(qū)域中的對(duì)象 對(duì)象滿了之后, 滿了之后,JVM

6、 系統(tǒng)將要做到可達(dá)性測(cè)試,主要任務(wù)是檢測(cè)有哪些 系統(tǒng)將要做到可達(dá)性測(cè)試,主要任務(wù)是檢測(cè)有哪些對(duì)象 對(duì)象由根集合出發(fā)是不可達(dá)的,這些 由根集合出發(fā)是不可達(dá)的,這些對(duì)象 對(duì)象就可以被 就可以被 JVM 回收,并且將所有的活動(dòng) 回收,并且將所有的活動(dòng)對(duì)象 對(duì)象從伊甸園區(qū)域拷貝到 從伊甸園區(qū)域拷貝到 To 區(qū)域,此時(shí)一些 區(qū)域,此時(shí)一些對(duì)象 對(duì)象將發(fā)生狀態(tài)交換,有的 將發(fā)生狀態(tài)交換,有的對(duì)象 對(duì)象就從 就從 To 區(qū)域被轉(zhuǎn)移到 區(qū)域被轉(zhuǎn)移到 F

7、rom 區(qū)域,此時(shí) 域,此時(shí) From 區(qū)域就有了 區(qū)域就有了對(duì)象 對(duì)象。上面 。上面對(duì)象 對(duì)象遷移的整個(gè)過程,都是由 遷移的整個(gè)過程,都是由 JVM 控制完成的。 控制完成的。 老對(duì)象 對(duì)象區(qū)域 區(qū)域:在老 在老對(duì)象 對(duì)象區(qū)域中的 區(qū)域中的對(duì)象 對(duì)象仍然會(huì)有一個(gè)較長(zhǎng)的生命周期,大多數(shù)的 仍然會(huì)有一個(gè)較長(zhǎng)的生命周期,大多數(shù)的 JVM 系統(tǒng)垃圾 系統(tǒng)垃圾對(duì)象 對(duì)象,都是源于 ,都是源于“短命 短命“對(duì)象 對(duì)象,經(jīng)過一段時(shí)間后,被轉(zhuǎn)入老 ,

8、經(jīng)過一段時(shí)間后,被轉(zhuǎn)入老對(duì)象 對(duì)象區(qū)域的 區(qū)域的對(duì)象 對(duì)象,就變成了垃圾 ,就變成了垃圾對(duì)象 對(duì)象。此時(shí),它們都被打上相應(yīng)的標(biāo)記, 。此時(shí),它們都被打上相應(yīng)的標(biāo)記,JVM 系統(tǒng)將會(huì)自動(dòng)回收這些垃圾 系統(tǒng)將會(huì)自動(dòng)回收這些垃圾對(duì)象 對(duì)象,建議不要頻繁地 ,建議不要頻繁地強(qiáng)制 強(qiáng)制系統(tǒng)作垃圾回收,這是因?yàn)?系統(tǒng)作垃圾回收,這是因?yàn)镴VM 會(huì)利用有限的系統(tǒng)資源,優(yōu)先完成垃圾回收工作,導(dǎo)致應(yīng)用無法快速地響應(yīng)來自用戶端的請(qǐng)求,這樣會(huì)影響系統(tǒng)的整體性

9、能。 會(huì)利用有限的系統(tǒng)資源,優(yōu)先完成垃圾回收工作,導(dǎo)致應(yīng)用無法快速地響應(yīng)來自用戶端的請(qǐng)求,這樣會(huì)影響系統(tǒng)的整體性能。 (2) 棧內(nèi)存 棧內(nèi)存 堆內(nèi)存主要用來存儲(chǔ)程序在運(yùn)行時(shí)創(chuàng)建或?qū)嵗膶?duì)象與變量。例如通過 new 關(guān)鍵字創(chuàng)建的對(duì)象。而棧內(nèi)存則是用來存儲(chǔ)程序代碼中聲明為靜態(tài)或非靜態(tài)的方法。 2. JVM 中對(duì)象的生命周期 中對(duì)象的生命周期 在 JVM 運(yùn)行空間中,對(duì)象的整個(gè)生命周期大致可以分為 7 個(gè)階段: 創(chuàng)建階段 創(chuàng)建階段; 應(yīng)用階

10、段 應(yīng)用階段; 不可視階段 不可視階段; 不可到達(dá)階段 不可到達(dá)階段; 可收集階段 可收集階段; 終結(jié)階段 終結(jié)階段; 釋放階段 釋放階段 SoftReference sr = new SoftReference(a); a = null; ... // 下次使用時(shí) if (sr != null) {a = sr.get();} else { // GC 由于低內(nèi)存,已釋放 a,因此需要重新裝載a = new A(); sr = ne

11、w SoftReference(a);}軟引用技術(shù)的引進(jìn)使 Java 應(yīng)用可以更好地管理內(nèi)存,穩(wěn)定系統(tǒng),防止系統(tǒng)內(nèi)存溢出,避免系統(tǒng)崩潰。因此在處理一些占用內(nèi)存較大且生命周期較長(zhǎng),但使用并不繁地對(duì)象時(shí)應(yīng)盡量應(yīng)用該技術(shù)。提高系統(tǒng)穩(wěn)定性。 弱引用 弱引用(Weak Reference):弱應(yīng)用對(duì)象與軟引用對(duì)象的最大不同就在于 弱應(yīng)用對(duì)象與軟引用對(duì)象的最大不同就在于:GC 在進(jìn)行垃圾回收時(shí),需要通過算法檢查是否回收 在進(jìn)行垃圾回收時(shí),需要通過算

12、法檢查是否回收 Soft 應(yīng)用對(duì)象,而對(duì)于 應(yīng)用對(duì)象,而對(duì)于Weak 引用, 引用,GC 總是進(jìn)行回收。 總是進(jìn)行回收。Weak 引用對(duì)象更容易、更快地被 引用對(duì)象更容易、更快地被 GC 回收。 回收。Weak 引用對(duì)象常常用于 引用對(duì)象常常用于 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 引用類型,并且釋放強(qiáng)引用 13. WeakReference wr = new WeakReference(a); 14. a = null;15. ... 16.17. // 下次使用時(shí) 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)對(duì)象指一些執(zhí)行完了 對(duì)象指一些執(zhí)行完了 finalize 函數(shù),并為不可達(dá)對(duì)象,但是還沒有被 函數(shù),并為不可達(dá)對(duì)象,但是還沒有被 GC 回收的對(duì)象。這種對(duì)象可以輔助 回收的對(duì)象。這種對(duì)象可以輔助 f

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 眾賞文庫(kù)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論