您好,登錄后才能下訂單哦!
這篇文章主要講解了“jvm垃圾回收機制的原理”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“jvm垃圾回收機制的原理”吧!
垃圾回收機制原理:
jvm如何判斷一個對象是不是垃圾?
使用可達性分析法去對一個GC roots對象進行分析,從一個節(jié)點GC ROOT 開始,尋找對應的引用節(jié)點,找到這個節(jié)點以后,繼續(xù)尋找這個節(jié)點的引用節(jié)點,當所有的引用節(jié)點尋找完畢之后,剩余的節(jié)點則被認為是沒有被引用到的節(jié)點,即無用的節(jié)點也就是垃圾。
java 中可作為 GC Root 的對象有:
1.虛擬機棧中引用的對象(本地變量表)
2.方法區(qū)中靜態(tài)屬性引用的對象
3. 方法區(qū)中常量引用的對象
4.本地方法棧中引用的對象(Native 對象)
對垃圾進行回收的垃圾回收算法:
1.Mark-Sweep(標記-清除)算法
這是最基礎的垃圾回收算法,之所以說它是最基礎的是因為它最容易實現(xiàn),思想也是最簡單的。標記-清除算法分為兩個階段:標記階段和清除階段。標記階段的任務是標記出所有需要被回收的對象,清除階段就是回收被標記的對象所占用的空間。標記-清除算法實現(xiàn)起來比較容易,但是有一個比較嚴重的問題就是容易產(chǎn)生內存碎片,碎片太多可能會導致后續(xù)過程中需要為大對象分配空間時無法找到足夠的空間而提前觸發(fā)新的一次垃圾收集動作。
2.Copying(復制)算法 新生代GC算法
它將可用內存按容量劃分為大小相等的兩塊,每次只使用其中的一塊。當這一塊的內存用完了,就將還存活著的對象復制到另外一塊上面,然后再把已使用的內存空間一次清理掉,這樣一來就不容易出現(xiàn)內存碎片的問題。
這種算法雖然實現(xiàn)簡單,運行高效且不容易產(chǎn)生內存碎片,但是卻對內存空間的使用做出了高昂的代價,因為能夠使用的內存縮減到原來的一半。
很顯然,Copying 算法的效率跟存活對象的數(shù)目多少有很大的關系,如果存活對象很多,
那么 Copying 算法的效率將會大大降低。
在復制算法中,當?shù)诙€步驟往復一次,jvm內對象年齡加一,當jvm往返15次,年齡達到15時,新生代會轉為老年代。
3.Mark-Compact(標記-整理)算法
標記整理算法在標記清除方法的基礎之上,也就是先對垃圾進行標記清除之后,再使存活對象向另一側移動,進行整理。
4.Generational Collection(分代收集)算法
分代收集算法是目前大部分 JVM 的垃圾收集器采用的算法。它的核心思想是根據(jù)對象存活的生命周期將內存劃分為若干個不同的區(qū)域。一般情況下將堆區(qū)劃分為老年代(TenuredGeneration)和新生代(Young Generation),老年代的特點是每次垃圾收集時只有少量對象需要被回收,而新生代的特點是每次垃圾回收時都有大量的對象需要被回收,那么就可以根據(jù)不同代的特點采取最適合的收集算法。
對于新生代采取標記復制算法,因為新生代中每次垃圾回收都要回收大部分對象,也就是說需要復制的操作次數(shù)較少,但是實際中并不是按照 1:1 的比例來劃分新生代的空間的,一般來說是將新生代劃分為一塊較大的 Eden 空間和兩塊較小的Survivor 空間,每次使用 Eden 空間和其中的一塊 Survivor 空間,當進行回收時,將 Eden和 Survivor 中還存活的對象復制到另一塊 Survivor 空間中,然后清理掉 Eden 和剛才使用過的 Survivor 空間。
老年代的特點是每次回收都只回收少量對象,所以使用標記整理算法。
注意,在堆區(qū)之外還有一個代就是永久代(Permanet Generation),它用來存儲 class類、常量、方法描述等。
對永久代的回收主要回收兩部分內容:廢棄常量和無用的類。
感謝各位的閱讀,以上就是“jvm垃圾回收機制的原理”的內容了,經(jīng)過本文的學習后,相信大家對jvm垃圾回收機制的原理這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內容。