<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                # Java 內存管理 – 垃圾回收算法 > 原文: [https://howtodoinjava.com/java/garbage-collection/revisiting-memory-management-and-garbage-collection-mechanisms-in-java/](https://howtodoinjava.com/java/garbage-collection/revisiting-memory-management-and-garbage-collection-mechanisms-in-java/) 我們都知道 Java 中[**垃圾收集器**](https://en.wikipedia.org/wiki/Garbage_collection_%28computer_science%29 "Garbage collector")(GC)的工作職責。 但是只有極少數的嘗試深入研究**垃圾收集的工作原理**。 您不是其中之一,這就是為什么您在這里。 在本 Java 內存管理教程中,我們將嘗試了解 Java 垃圾回收的最新算法,并了解這些算法的發展。 ```java Table of Contents 1\. Memory management in Java 2\. Reference counting mechanism 3\. Mark and sweep mechanism 4\. Stop and copy GC 5\. Generational stop and copy 6\. How to improve memory utilization in Java ``` ## 1\. Java 中的內存管理 [Java 中的內存管理](http://www.oracle.com/technetwork/java/javase/memorymanagement-whitepaper-150215.pdf "java memory management")是垃圾收集器的職責。 這與 Java 之前的實踐相反,在 Java 之前,程序員負責分配程序中的內存。 正式而言,**垃圾收集器負責**: * 分配內存 * 確保所有引用的對象都保留在內存中,并且 * 恢復由執行代碼中的引用無法訪問的對象使用的內存。 在應用程序運行時,應用程序會創建許多對象,每個對象都有其生命周期。 在內存中,被其他對象引用的對象稱為**活動對象**。 不再由任何活動對象引用的對象被視為**死對象**,并被稱為*垃圾*。 查找和釋放(也稱為回收)這些對象使用的空間的過程稱為**垃圾回收**。 垃圾回收解決了許多但不是全部的內存分配問題。 例如,我們可以無限期地創建對象并繼續引用它們,直到沒有更多可用的內存為止([***內存不足錯誤***](https://en.wikipedia.org/wiki/Out_of_memory "Out of memory"))。 垃圾收集是一項復雜的任務,需要花費時間和資源。 它在通常由稱為堆的大型內存池分配的空間上運行。 垃圾收集的**時機**由垃圾收集器決定。 通常,整個堆或堆的一部分會在堆滿或達到占用率的百分比時收集。 從 J2SE 5.0 開始,Java HotSpot 虛擬機包括四個垃圾收集器。 所有的收藏家都是世代相傳的。 我們將在后面的部分中了解有關世代 GC 的更多信息。 > 閱讀更多:[垃圾收集算法(針對 Java 9 更新)](https://howtodoinjava.com/java/garbage-collection/all-garbage-collection-algorithms/) ## 2\. 引用計數機制 從初始版本開始,這已經是非常古老的 GC 機制。 在引用計數技術中,每個對象都有從其他對象和棧指向該對象的指針數。 每次引用新對象時,計數器都會增加一。 同樣,當任何對象丟失其引用時,計數器將減一。 當計數達到“0”時,垃圾回收器可以取消分配對象。 引用計數算法的主要**優勢**在分配給新對象時,每次寫入內存的工作量很少。 但是,它具有**數據周期**的**嚴重問題**。 這意味著當第一個對象被第二個對象引用,第二個對象被第一個對象引用(**循環引用**)時,計數永遠不會為零,因此它們永遠也不會被垃圾回收。 ## 3\. 標記和掃描機制 ![Mark and sweep GC](https://img.kancloud.cn/8f/ef/8fefb32ab0dfe7b58e15f2bbf784c9a5_220x168.png) 標記和掃描算法 標記清除算法是第一個要開發的垃圾收集算法,它能夠回收循環數據結構。 在這種算法中,GC 將首先將某些對象標識為默認可達對象,這些對象通常是棧中的全局變量和局部變量。 有所謂的活動對象。 在下一步中,算法開始從這些活動對象中跟蹤對象,并將它們也標記為活動對象。 繼續執行此過程,直到檢查所有對象并將其標記為活動。 完全跟蹤后未標記為活動的對象被視為死對象。 使用標記掃描時,未引用的對象不會立即被回收。 取而代之的是,允許垃圾收集累積,直到所有可用內存都用完為止。 發生這種情況時,該程序的執行將暫時暫停(稱為 **Stop the world** ),而標記清除算法將收集所有垃圾。 一旦回收了所有未引用的對象,就可以恢復程序的正常執行。 除了暫停應用程序一段時間外,此技術還需要經常對內存地址空間進行**碎片整理**,這是另一項開銷。 ## 4\. 停止和復制 GC 像“標記和清除”一樣,該算法還取決于識別活動對象并對其進行標記。 區別在于它處??理活動對象的方式。 停止和復制技術將整個堆設計在兩個**半空間**中。 一次只有一個半空間處于活動狀態,而為新創建的對象分配的內存僅發生在單個半空間中,而另一個保持平靜。 GC 運行時,它將開始標記當前半空間中的活動對象,完成后,它將所有活動對象復制到其他半空間中。 當前半空間中的所有其余對象都被視為已死,并已被垃圾回收。 與以前的方法一樣,它具有**的一些優點**,就像它僅接觸活動物體一樣。 另外,不需要分段,因為在切換半空間時,會完成**內存收縮**。 這種方法的主要缺點是需要將所需的內存大小增加一倍,因為在給定的時間點僅使用了一半。 除此之外,它還需要在切換半空間時停止世界。 ## 5\. 分代停止和復制 像“停止并復制”技術一樣,它也將內存劃分為半空間,但現在它們是三個半空間。 這些半空間在這里稱為世代。 因此,該技術中的內存分為三代-**新生代**,**老年代**和**永久代**。 大多數對象最初是在新生代中分配的。 老年代包含的對象在許多新生代集合中幸存下來,還有一些大型對象可以直接在老年代中分配。 永久生成包含 JVM 認為便于垃圾回收器管理的對象,例如描述類和方法的對象,以及類和方法本身。 當新生代填滿時,將執行該一代的新生代垃圾回收(有時稱為**次要垃圾回收**)。 當老年代或永久代填滿時,通常會完成所謂的完整垃圾收集(有時稱為**主要收集**)。 即,收集了所有的世代。 通常,首先使用專門為該代設計的垃圾收集算法來收集年輕代,因為它通常是識別年輕代中最有效的垃圾算法。 幸存于 GC 跟蹤中的對象被推入更早的年代。 出于明顯的原因,較老的一代被收集的頻率較低,即他們在那里的原因是時間更長。 除上述情況外,如果發生碎片/壓縮,則每一代都將單獨壓縮。 該技術的主要優點是在較年輕的一代中早期回收死對象,而無需每次都掃描整個內存以識別死對象。 較早的對象已經經歷了一些 GC 周期,因此假定它們在系統中的存在時間更長,因此無需頻繁掃描它們(不是每次都完美的情況,但大多數情況下應該如此)。 **缺點**仍然相同,即在 GC 運行全掃描時,需要對存儲區進行碎片整理,并且需要停止世界(應用程序)。 ## 6\. 如何提高 Java 的內存利用率 1. 不要分配過多的內存。 僅根據需要分配內存。 這特別適用于 Java 數組。 2. 不要堅持引用。 一旦使用了對象且不再需要該對象,則為其分配`null`引用。 3. 查找并解析內存[**泄漏**](https://en.wikipedia.org/wiki/Memory_leak "memory leaks") 4. 在每個發行版上執行[**系統性能分析**](https://en.wikipedia.org/wiki/Profiling_%28computer_programming%29 "profiling")來驗證內存增加 5. 不要依賴`System.gc()`運行垃圾收集 希望對**垃圾收集機制**有所幫助,該機制可為 Java 程序實現自動內存管理。 這可以幫助您回答 Java 內存管理[面試問題](https://howtodoinjava.com/java-interview-questions/)。 學習愉快!
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看