jvm中怎樣確定垃圾,針對這個問題,這篇文章詳細介紹了相對應(yīng)的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。
創(chuàng)新互聯(lián)為企業(yè)提供:品牌網(wǎng)站設(shè)計、網(wǎng)絡(luò)營銷策劃、小程序設(shè)計、營銷型網(wǎng)站建設(shè)和網(wǎng)站運營托管,一站式網(wǎng)絡(luò)營銷整體服務(wù)。實現(xiàn)不斷獲取潛在客戶之核心目標,建立了企業(yè)專屬的“成都全網(wǎng)營銷”,就用不著再為了獲取潛在客戶而苦惱,相反,客戶會主動找您,生意就找上門來了!
一、 如何確定垃圾
1.1. 引用計數(shù)法
在 Java 中,引用和對象是有關(guān)聯(lián)的。如果要操作對象則必須用引用進行。因此,很顯然一個簡單的辦法是通過引用計數(shù)來判斷一個對象是否可以回收。簡單說,即一個對象如果沒有任何與之關(guān)
聯(lián)的引用,即他們的引用計數(shù)都不為 0,則說明對象不太可能再被用到,那么這個對象就是可回收對象。
1.2. 可達性分析
為了解決引用計數(shù)法的循環(huán)引用問題,Java 使用了可達性分析的方法。通過一系列的“GC roots”對象作為起點搜索。如果在“GC roots”和一個對象之間沒有可達路徑,則稱該對象是不可達的。要注意的是,不可達對象不等價于可回收對象,不可達對象變?yōu)榭苫厥諏ο笾辽僖?jīng)過兩次標記過程。兩次標記后仍然是可回收對象,則將面臨回收。
2.1標記清除算法(Mark-Sweep)
最基礎(chǔ)的垃圾回收算法,分為兩個階段,標注和清除。標記階段標記出所有需要回收的對象,清除階段回收被標記的對象所占用的空間。如圖
從圖中我們就可以發(fā)現(xiàn),該算法最大的問題是內(nèi)存碎片化嚴重,后續(xù)可能發(fā)生大對象不能找到可利用空間的問題。
2.2 復(fù)制算法(copying)
為了解決 Mark-Sweep 算法內(nèi)存碎片化的缺陷而被提出的算法。按內(nèi)存容量將內(nèi)存劃分為等大小的兩塊。每次只使用其中一塊,當這一塊內(nèi)存滿后將尚存活的對象復(fù)制到另一塊上去,把已使用的內(nèi)存清掉,如圖:
這種算法雖然實現(xiàn)簡單,內(nèi)存效率高,不易產(chǎn)生碎片,但是最大的問題是可用內(nèi)存被壓縮到了原本的一半。且存活對象增多的話,Copying 算法的效率會大大降低。
2.3標記整理算法(Mark-Compact)
結(jié)合了以上兩個算法,為了避免缺陷而提出。標記階段和 Mark-Sweep 算法相同,標記后不是清
理對象,而是將存活對象移向內(nèi)存的一端。然后清除端邊界外的對象。如圖:
關(guān)于jvm中怎樣確定垃圾問題的解答就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道了解更多相關(guān)知識。