內(nèi)存區(qū)域
Java虛擬機(jī)在執(zhí)行Java程序的過程中會把他所管理的內(nèi)存劃分為若干個不同的數(shù)據(jù)區(qū)域。Java虛擬機(jī)規(guī)范將JVM所管理的內(nèi)存分為以下幾個運行時數(shù)據(jù)區(qū):程序計數(shù)器琼牧,Java虛擬機(jī)棧,本地方法棧撬槽,Java堆趾撵,方法區(qū)。
image
具體參考:Java內(nèi)存區(qū)域與內(nèi)存溢出
常用的垃圾回收算法:
-
引用計數(shù)算法:
給對象添加一個引用計數(shù)器暂题,每當(dāng)有一個地方引用它時敢靡,計數(shù)器值就加1苦银;當(dāng)引用失效時赶站,計數(shù)器值就減1贝椿;任何時刻計數(shù)器值為0 的對象就是不再被使用的陷谱,垃圾回收器將收回該對象所使用的內(nèi)存。
引用計數(shù)算法實現(xiàn)簡單渣窜,效率很高宪躯,微軟的COM技術(shù)、ActionScript详瑞、Python等都使用了引用計數(shù)算法進(jìn)行內(nèi)存管理臣缀,但是引用計數(shù)算法對于對象之間相互循環(huán)引用問題難以解決,因此java并沒有使用引用計數(shù)算法计寇。 -
根搜索算法:
通過一系列的名為“GC Root”的對象作為起點氯窍,從這些節(jié)點向下搜索,搜索所走過的路徑稱為引用鏈(Reference Chain)贝淤,當(dāng)一個對象到GC Root沒有任何引用鏈相連時政供,則該對象不可達(dá),該對象是不可使用的离陶,垃圾收集器將回收其所占的內(nèi)存衅檀。
主流的商用程序語言C#、java和Lisp都使用根搜素算法進(jìn)行內(nèi)存管理沉眶。
在java語言中,可作為GC Root的對象包括以下幾種對象:
a. java虛擬機(jī)棧(棧幀中的本地變量表)中的引用的對象柳击。
b.方法區(qū)中的類靜態(tài)屬性引用的對象片习。
c.方法區(qū)中的常量引用的對象。
d.本地方法棧中JNI本地方法的引用對象状知。
Java中使用的垃圾回收算法:
- 引用計數(shù)法:缺點是無法處理循環(huán)引用問題
- 標(biāo)記-清除法:標(biāo)記所有從根結(jié)點開始的可達(dá)對象侈离,缺點是會造成內(nèi)存空 間不連續(xù),不連續(xù)的內(nèi)存空間的工作效率低于連續(xù)的內(nèi)存空間,不容易分配內(nèi)存
- 復(fù)制算法:將內(nèi)存空間分成兩塊起宽,每次將正在使用的內(nèi)存中存活對象復(fù)制到未使用的內(nèi)存塊中,之后清除正在使用的內(nèi)存塊绿映。算法效率高腐晾,但是代價是系統(tǒng)內(nèi)存折半。適用于新生代(存活對象少淹冰,垃圾對象多)
- 標(biāo)記-壓縮算法:標(biāo)記-清除的改進(jìn)樱拴,清除未標(biāo)記的對象時還將所有的存活對象壓縮到內(nèi)存的一端洋满,之后,清理邊界所有空間既避免碎片產(chǎn)生牺勾,又不需要兩塊同樣大小的內(nèi)存快,性價比高翻具。適用于老年代。
-
分代
詳細(xì)內(nèi)容參考: 深入理解java垃圾回收算法
參考:深入理解 Java 垃圾回收機(jī)制