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