亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java語言的垃圾回收機制以及垃圾回收常用算法

發布時間:2021-09-09 12:55:02 來源:億速云 閱讀:179 作者:chen 欄目:大數據

本篇內容介紹了“Java語言的垃圾回收機制以及垃圾回收常用算法”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

Java語言的垃圾回收

為了讓程序員更專注于代碼的實現,而不用過多的考慮內存釋放的問題,所以,在Java語言中,有了自動的垃圾回收機制,也就是我們熟悉的GC。
有了垃圾回收機制后,程序員只需要關心內存的申請即可,內存的釋放由系統自動識別完成。
換句話說,自動的垃圾回收的算法就會變得非常重要了,如果因為算法的不合理,導致內存資源一直沒有釋放,同樣也可能會導致內存溢出的。
當然,除了Java語言,C#、Python等語言也都有自動的垃圾回收機制。

Java的垃圾回收常用算法

引用計數法

原理

假設有一個對象A,任何一個對象對A的引用,那么對象A的引用計數器+1,當引用失敗時,對象A的引用計數器就-1,如果對象A的計數器的值為0,就說明對象A沒有引用了,可以被回收。

優劣分析
  1. 優勢
    實時性較高,無需等到內存不夠的時候,才開始回收,運行時根據對象的計數器是否為0,就可以直接回收。
    在垃圾回收過程中,應用無需掛起。如果申請內存時,內存不足,則立刻報
    outofmember 錯誤。
    區域性,更新對象的計數器時,只是影響到該對象,不會掃描全部對象。

  2. 劣勢
    每次對象被引用時,都需要去更新計數器,有一點時間開銷。
    浪費CPU資源,即使內存夠用,仍然在運行時進行計數器的統計。
    無法解決循環引用問題。(最大的缺點)
    循環問題演示:

  
    
  
  
  
class TestA {    public TestB b ;}class TestB{    public TestA a;}
public class Main {    public static void main(String[] args) {        TestA a = new TestA();        TestB b = new TestB();        a.b = b;        b.a = a;        a = null;        b = null;//     雖然被設置為null,但是a與b之間依舊存在著循環引用的問題    }}
           

標記-清除算法

原理

標記清除算法,是將垃圾回收分為2個階段,分別是標記和清除。
標記:從根節點開始標記引用的對象。
清除:未被標記引用的對象就是垃圾對象,可以被清理。


Java語言的垃圾回收機制以及垃圾回收常用算法

初始狀態下,所有的目標對象都是為0(未被標記)
待jvm出現有效內存耗盡,就會掛起線程,執行GC線程,進行標記


Java語言的垃圾回收機制以及垃圾回收常用算法

從根節點進行標記到最后,然后回收未被標記的對象。
清理完畢之后掛起gc線程,重新執行原先被掛起的線程。
而被標記的對象會被重新置0;


Java語言的垃圾回收機制以及垃圾回收常用算法

優劣分析
  1. 優勢
    很明顯的解決了循環應用導致的不能被回收的問題

  2. 缺點
    缺點也很明顯
    效率較低,標記和清除兩個動作都需要遍歷所有的對象,并且在GC時,需要停止應用程序,對于交互性要求比較高的應用而言這個體驗是非常差的。
    通過標記清除算法清理出來的內存,碎片化較為嚴重,因為被回收的對象可能存在于內存的各個角落,所以清理出來的內存是不連貫的

標記-壓縮算法

原理

標記壓縮算法是在標記清除算法的基礎之上,做了優化改進的算法。和標記清除算法一樣,也是從根節點開始,對對象的引用進行標記,在清理階段,并不是簡單的清理未標記的對象,而是將存活的對象壓縮到內存的一端,然后清理邊界以外的垃圾,從而解決了碎片化的問題。
Java語言的垃圾回收機制以及垃圾回收常用算法

優劣分析
  1. 優點
    在標記清除算法的基礎上解決了產生碎片的問題

  2. 缺點
    算法多出一步壓縮,所以在性能上也會有所影響

復制算法

原理

復制算法的核心就是:將原有的內存空間一分為二,每次只用其中的一塊,在垃圾回收時,將正在使用的對象復制到另一個內存空間中,然后將該內存空間清空,交換兩個內存的角色,完成垃圾的回收。
典型的復制算法的落地實現就是:jvm中堆內存的年輕代的gc策略(具體可以看我jvm系列的博客的內存模型的那一部分內容)

  1. 在GC開始的時候,對象只會存在于Eden區和名為“From”的Survivor區,Survivor 區“To”是空的。

  2. 緊接著進行GC,Eden區中所有存活的對象都會被復制到“To”,而在“From”區中仍存活的對象會根據他們的年齡值來決定去向。年齡達到一定值(年齡閾值,可以通過- XX:MaxTenuringThreshold來設置)的對象會被移動到年老代中,沒有達到閾值的對象會被復制到“To”區域。

  3. 經過這次GC后,Eden區和From區已經被清空。這個時候,“From”和“To”會交他們的角色,也就是新的“To”就是上次GC前的“From”,新的“From”就是上次GC前的“To”。不管怎樣,都會保證名為To的Survivor區域是空的。

  4. GC會一直重復這樣的過程,直到“To”區被填滿,“To”區被填滿之后,會將所有象移動到年老代中。

優劣分析
  1. 優勢
    在垃圾對象多的情況下,效率較高
    清理后,內存無碎片

  2. 劣勢
    在垃圾對象少的情況下,不適用,如:老年代內存
    分配的2塊內存空間,在同一個時刻,只能使用一半,內存使用率僅有50%

分代算法

前面介紹了多種回收算法,每一種算法都有自己的優點也有缺點,誰都不能替代誰,所以根據垃圾回收對象的特點進行選擇,才是明智的選擇。
分代算法其實就是這樣的,根據回收對象的特點進行選擇,在jvm中,年輕代適合使用復制算法,老年代適合使用標記清除或標記壓縮算法。

“Java語言的垃圾回收機制以及垃圾回收常用算法”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

长白| 红安县| 清远市| 乌鲁木齐县| 白山市| 孙吴县| 富宁县| 于都县| 观塘区| 沅江市| 铁岭市| 揭西县| 西青区| 福州市| 德格县| 革吉县| 农安县| 莱芜市| 万州区| 都江堰市| 镇赉县| 徐闻县| 民丰县| 仙游县| 阿拉善右旗| 翁源县| 周宁县| 泰安市| 五原县| 澜沧| 大渡口区| 卢湾区| 中卫市| 竹山县| 盐池县| 剑河县| 穆棱市| 神木县| 南丰县| 城口县| 西贡区|