Java中怎么使用JVM實現(xiàn)內(nèi)存管理,相信很多沒有經(jīng)驗的人對此束手無策,為此本文總結(jié)了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個問題。
成都創(chuàng)新互聯(lián)公司是一家專業(yè)提供金灣企業(yè)網(wǎng)站建設(shè),專注與成都做網(wǎng)站、成都網(wǎng)站建設(shè)、H5網(wǎng)站設(shè)計、小程序制作等業(yè)務(wù)。10年已為金灣眾多企業(yè)、政府機構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專業(yè)網(wǎng)站設(shè)計公司優(yōu)惠進行中。
1. 查找失效對象
1.1 引用計數(shù)法
可以為每一個對象添加一個引用計數(shù)器,用于存儲當(dāng)前對象被幾處引用。
引用計數(shù)法簡單高效,但無法解決循環(huán)引用問題,如A引用B,B又引用A,且這兩個對象不再被其它對象引用,那么在使用引用計數(shù)法的情況下,這兩個對象的引用數(shù)均為1,且無法減至0。
1.2 可達(dá)性分析算法
可以通過一系列成為“GC Roots”的對象作為起始點,并從這些節(jié)點向下搜索,當(dāng)一個對象到GC Roots不可達(dá),則證明該對象不可用。
圖1-1
GC Roots對象包括下面幾種:
o 虛擬機棧中引用的對象。
o 方法區(qū)中類靜態(tài)屬性引用的對象。
o 方法區(qū)中常量引用的對象。
o 本地方法棧中引用的對象。
一個對象要真正被清理,至少需要兩次標(biāo)記過程。
1.3 回收方法區(qū)
方法區(qū)垃圾回收的效率與性價比都遠(yuǎn)低于堆內(nèi)存的回收。
主要回收兩部分:廢棄常量和無用的類。
2. 垃圾收集算法
2.1 標(biāo)記-清除算法
圖2-1
標(biāo)記清除算法的標(biāo)記階段與清除階段效率都不高,且會產(chǎn)生大量內(nèi)存碎片。
2.2 復(fù)制算法
圖2-2
將內(nèi)存平分為兩塊,每次只使用其中一塊。
當(dāng)一塊內(nèi)存快用完時,可將存活的對象復(fù)制到另一塊上面,然后將剛才使用的內(nèi)存一次性清理掉。
該算法簡單高效,且不會產(chǎn)生內(nèi)存碎片,但由于有一半空閑內(nèi)存,所以內(nèi)存使用率不高。
HotSpot中,新生代內(nèi)存結(jié)構(gòu)為 1 * Eden + 2 * Survivor,每次只使用Eden區(qū)和其中一塊Survivor區(qū),當(dāng)發(fā)生回收時,會將Eden與在用的Survivor中的存活對象復(fù)制到另一塊Survivor區(qū)中。
根據(jù)HotSpot的內(nèi)存結(jié)構(gòu),可見只有10%的內(nèi)存(其中一塊Survivor)被浪費,但此時有另一個問題,即實際情況下我們不能保證每次回收的存活對象都僅占內(nèi)存的10%以下,所以當(dāng)Survivor也不夠用時,就需要依賴其它內(nèi)存(老年代)做分配擔(dān)保。
2.3 標(biāo)記-整理算法
在對象存活率高的情況下,復(fù)制算法需要進行較多的賦值操作,效率會變低,同時備用空間也是對內(nèi)存的一種浪費。
對于老年代,可能存在所有對象都存活的情況,所以直接使用復(fù)制算法是不合適的,所以出現(xiàn)了標(biāo)記-整理算法。
圖2-3
看完上述內(nèi)容,你們掌握J(rèn)ava中怎么使用JVM實現(xiàn)內(nèi)存管理的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀!