簡(jiǎn)單談?wù)凧ava垃圾回收
好久沒看關(guān)于java的書了,最近,看了James Gosling的<<Java程序設(shè)計(jì)語言>>,做了一些讀書筆記。這部分是關(guān)于垃圾回收的。
一. 垃圾回收
對(duì)象是使用new創(chuàng)建的,但是并沒有與之相對(duì)應(yīng)的delete操作來回收對(duì)象占用的內(nèi)存。當(dāng)我們完成對(duì)某個(gè)對(duì)象的使用時(shí),只需停止該對(duì)象的引用:
->將引用改變?yōu)橹赶蚱渌麑?duì)象
->將引用指向null
->從方法中返回, 使得該方法的局部變量不復(fù)存在
要點(diǎn):
->當(dāng)我們從任何可執(zhí)行代碼都無法到達(dá)某個(gè)對(duì)象時(shí),它所占用的空間就可以被回收。
->垃圾回收意味著我們永遠(yuǎn)不用擔(dān)心出現(xiàn)虛懸引用(dangling reference)。虛懸引用,指得是引用已經(jīng)被刪除的內(nèi)存空間。在那些程序員可以直接控制何時(shí)刪除對(duì)象的系統(tǒng)中,會(huì)存在這樣的問題。
->垃圾回收器模型:引用計(jì)數(shù)器法(不能解決循環(huán)引用),標(biāo)記-清除(mark-and-sweep)。
二. 總結(jié)
finalize方法
->在垃圾回收器確定該對(duì)象是不可達(dá)的且該對(duì)象的空間將被回收之后,垃圾回收器就會(huì)調(diào)用這個(gè)方法。
->這個(gè)方法可以清除該對(duì)象所使用的所有非內(nèi)存資源,對(duì)每一個(gè)對(duì)象最多只能調(diào)用一次,即使在這個(gè)方法的執(zhí)行使得該對(duì)象重新變?yōu)榭蛇_(dá)之后又馬上會(huì)再次變?yōu)椴豢蛇_(dá)的情況下,該方法也只能調(diào)用一次。
->finalize方法可以在任何特定的時(shí)間段內(nèi)被調(diào)用,它也可能永遠(yuǎn)不會(huì)被調(diào)用(java虛擬機(jī)結(jié)束)。
覆寫finalize方法
->當(dāng)一個(gè)對(duì)象變成垃圾時(shí),它所引用的其他對(duì)象也很有可能會(huì)變成垃圾。這些垃圾可能在調(diào)用我們編寫的finalize方法之前就已經(jīng)被終結(jié)了,因此它們可能處于不可預(yù)知的狀態(tài)。
->覆寫finalize方法是,加上super.finalize方法。最好加在finally字句里面。保證其超類中聲明的部分內(nèi)容也可以被終結(jié)。
三. 與垃圾回收器交互的相關(guān)類和方法
類:Runtime.getRuntime(), System
方法:gc(), runFinalization(), freeMemory(), totalMemory(), maxMemory()
System類支持靜態(tài)的gc()和runFinalization()方法,它們將調(diào)用當(dāng)前Runtime對(duì)象上的相應(yīng)方法。
四. 可達(dá)性狀態(tài)和引用對(duì)象
對(duì)象只有在沒有任何引用指定它的時(shí)候才可以被當(dāng)作垃圾回收,但有時(shí)我們可能希望在仍舊有選定引用指向?qū)ο髸r(shí),將該對(duì)象作為垃圾回收掉。
引用對(duì)象的唯一用途就是維護(hù)對(duì)另一個(gè)被稱為指稱物(referent)的對(duì)象的引用。通常我們通過字段或者局部變量來維護(hù)對(duì)對(duì)象的引用,但是現(xiàn)在我們可以維護(hù)對(duì)引用對(duì)象的直接引用,而該引用對(duì)象包裝了我們實(shí)際需要的對(duì)象。垃圾回收器可能判斷出對(duì)某個(gè)對(duì)象的殘留引用是否都是經(jīng)由引用對(duì)象面引用到該對(duì)象的,因此它可以決定是否要回收該對(duì)象。引用對(duì)象的強(qiáng)度將決定垃圾回收器的行為,普通的引用都是強(qiáng)度最大的引用。
Reference類
->包:java.lang.ref
->典型方法: get(), clear(), enqueue(), isEnqueued()
引用和可達(dá)性強(qiáng)度
->對(duì)象是強(qiáng)可達(dá)的(strongly reachable):普通的引用
->對(duì)象是軟可達(dá)的(softly reachable):SoftReference
->對(duì)象是弱可達(dá)的(weakly reachable):WeakReference
->對(duì)象是虛可達(dá)的(phantom reachable):PhantomReference
->對(duì)象是不可達(dá)的:沒有引用鏈接
一旦對(duì)象變?yōu)槿蹩蛇_(dá)的(或者列弱),它就可以被終結(jié)。如果在終結(jié)之后該對(duì)象是不可達(dá)的,那么它就可以被回收了。
對(duì)象可達(dá)性階段會(huì)觸發(fā)垃圾回收器對(duì)相關(guān)的引用對(duì)象類型做出適當(dāng)?shù)男袨椋?br />
->軟可達(dá)對(duì)象可能會(huì)任憑垃圾回收器去回收。我們可確定的是所有對(duì)軟可達(dá)對(duì)象的SoftReference都會(huì)在拋出outofMemoryError錯(cuò)誤這前被清除。
->弱可達(dá)對(duì)象將會(huì)被垃圾回收器回收。
->虛可達(dá)對(duì)象并不是真正意義上的可達(dá),因?yàn)闊o法通過PhantomReference訪問其指稱對(duì)象,其get方法總是返回null。但是虛引用的存在可以防止對(duì)象在顯式清除虛引用之前被回收。虛引用使我們可以處理那些finalize方法已經(jīng)被調(diào)用過的對(duì)象,從而可以安全地認(rèn)為它們是"死"的。
相關(guān)文章
SpringMVC修改返回值類型后的消息轉(zhuǎn)換器處理方式
這篇文章主要介紹了SpringMVC修改返回值類型后的消息轉(zhuǎn)換器處理方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-09-09
java數(shù)學(xué)類Math?BigInteger?BigDecimal使用介紹
這篇文章主要為大家介紹了java數(shù)學(xué)類Math、BigInteger、BigDecimal的使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-06-06
javaweb servlet中使用請(qǐng)求轉(zhuǎn)發(fā)亂碼的實(shí)現(xiàn)
下面小編就為大家?guī)硪黄猨avaweb servlet中使用請(qǐng)求轉(zhuǎn)發(fā)亂碼的實(shí)現(xiàn)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-08-08
web項(xiàng)目WEB-INF下沒有web.xml的解決方法
新手如果在web項(xiàng)目創(chuàng)建后WEB-INF下面沒有出現(xiàn)web.xml,怎么辦?別慌,沒有web.xml文件的原因是因?yàn)樵趧?chuàng)建web項(xiàng)目的時(shí)候沒有把創(chuàng)建web.xml勾上。這篇文章主要介紹了web項(xiàng)目WEB-INF下沒有web.xml的解決方法,需要的朋友可以參考下2022-12-12
Spring Boot集成Redis實(shí)現(xiàn)緩存機(jī)制(從零開始學(xué)Spring Boot)
這篇文章主要介紹了Spring Boot集成Redis實(shí)現(xiàn)緩存機(jī)制(從零開始學(xué)Spring Boot),需要的朋友可以參考下2017-04-04
SpringBoot實(shí)現(xiàn)kafka多源配置的示例代碼
實(shí)際開發(fā)中,不同的topic可能來自不同的集群,所以就需要配置不同的kafka數(shù)據(jù)源,基于springboot自動(dòng)配置的思想,最終通過配置文件的配置,自動(dòng)生成生產(chǎn)者及消費(fèi)者的配置,本文介紹了SpringBoot實(shí)現(xiàn)kafka多源配置,需要的朋友可以參考下2024-06-06
詳解RSA加密算法的原理與Java實(shí)現(xiàn)
這篇文章主要和大家分享非對(duì)稱加密中的一種算法,那就是 RSA 加密算法。本文介紹了RSA算法的原理與Java實(shí)現(xiàn),感興趣的小伙伴可以嘗試一下2022-10-10

