本篇內(nèi)容主要講解“怎么使用Java垃圾回收算法”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學(xué)習(xí)“怎么使用Java垃圾回收算法”吧!
宿遷網(wǎng)站制作公司哪家好,找成都創(chuàng)新互聯(lián)!從網(wǎng)頁設(shè)計、網(wǎng)站建設(shè)、微信開發(fā)、APP開發(fā)、響應(yīng)式網(wǎng)站等網(wǎng)站項目制作,到程序開發(fā),運營維護。成都創(chuàng)新互聯(lián)從2013年創(chuàng)立到現(xiàn)在10年的時間,我們擁有了豐富的建站經(jīng)驗和運維經(jīng)驗,來保證我們的工作的順利進行。專注于網(wǎng)站建設(shè)就選成都創(chuàng)新互聯(lián)。
引用計數(shù)法:在Java中,引用和對象是有關(guān)聯(lián)的。如果要操作對象則必須用引用進行。因此,很顯然一個簡單的辦法是通過引用計數(shù)來判斷一個對象是否可以回收。簡單說,即一個對象如果沒有任何與之關(guān)聯(lián)的引用,即他們的引用計數(shù)都不為0,則說明對象不太可能再被用到,那么這個對象就是可回收對象。
可達性分析:為了解決引用計數(shù)法的循環(huán)引用問題,Java使用了可達性分析的方法。通過一系列“GC roots”對象作為起點搜索。如果在“GC roots”和一個對象之間沒有可達路徑,則稱該對象是不可達的。要注意的是,不可達對象不等價于可回收對象,不可達對象變?yōu)榭苫厥諏ο笾辽僖?jīng)過兩次標記過程。兩次標記后仍然是可回收對象,則將面臨回收。
垃圾回收算法
標記清除算法(Mark-Sweep)最基礎(chǔ)的垃圾回收算法,分為兩個階段,標注和清除。標記階段標記出所有需要回收的對象,清除階段回收被標記的對象所占用的空間。該算法最大的問題是內(nèi)存碎片化嚴重,后續(xù)可能發(fā)生大對象不能找到可利用空間的問題。
復(fù)制算法(copying)為了解決Mark-Sweep 算法內(nèi)存碎片化的缺陷而被提出的算法。按內(nèi)存容量將內(nèi)存劃分為等大小的兩塊。每次只使用其中一塊,當這一塊內(nèi)存滿后將尚存活的對象復(fù)制到另一塊上去,把已使用的內(nèi)存清掉。這種算法雖然實現(xiàn)簡單,內(nèi)存效率高,不易產(chǎn)生碎片,但是最大的問題是可用內(nèi)存被壓縮到了原本的一半。且存活對象增多的話,Copying 算法的效率會大大降低。
分代收集算法分代收集法是目前大部分JVM所采用的方法,其核心思想是根據(jù)對象存活的不同生命周期將內(nèi)存劃分為不同的域,一般情況下將GC堆劃分為老生代(Tenured/Old Generation)和新生代(Young Generation)。老生代的特點是每次垃圾回收時只有少量對象需要被回收,新生代的特點是每次垃圾回收時都有大量垃圾需要被回收,因此可以根據(jù)不同區(qū)域選擇不同的算法。
新生代與復(fù)制算法
目前大部分JVM的GC對于新生代都采取Copying算法,因為新生代中每次垃圾回收都要回收大部分對象,即要復(fù)制的操作比較少,但通常并不是按照1:1來劃分新生代。一般將新生代劃分為一塊較大的Eden空間和兩個較小的Survivor空間(From Space, To Space),每次使用Eden空間和其中的一塊Survivor空間,當進行回收時,將該兩塊空間中還存活的對象復(fù)制到另一塊Survivor空間中。
老年代與標記復(fù)制算法
老年代因為每次只回收少量對象,因而采用Mark-Compact算法。
(1)Java虛擬機提到過的處于方法區(qū)的永生代(Permanet Generation),它用來存儲class類,常量,方法描述等。對永生代的回收主要包括廢棄常量和無用的類。
(2)對象的內(nèi)存分配主要在新生代的Eden Space和Survivor Space的From Space(Survivor 目前存放對象的那一塊),少數(shù)情況會直接分配到老生代。
(3)當新生代的Eden Space和 From Space空間不足時就會發(fā)生一次GC,進行GC后,Eden Space和From Space區(qū)的存活對象會被挪到To Space,然后將Eden Space和From Space進行清理。
(4)如果To Space無法足夠存儲某個對象,則將這個對象存儲到老生代。
(5)在進行GC后,使用的便是Eden Space和To Space了,如此反復(fù)循環(huán)。
(6)當對象在Survivor區(qū)躲過一次GC后,其年齡就會+1。默認情況下年齡到達15的對象會被移到老生代中。
到此,相信大家對“怎么使用Java垃圾回收算法”有了更深的了解,不妨來實際操作一番吧!這里是創(chuàng)新互聯(lián)網(wǎng)站,更多相關(guān)內(nèi)容可以進入相關(guān)頻道進行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!