垃圾回收,幾種GC算法及GC機制

1.什么是垃圾回收?如何觸發垃圾回收??

垃圾回收(GC)是自動管理內存的一種機制,它負責自動釋放不再被程序引用的對象所占用的內存,這種機制減少內存泄漏和內存管理錯誤的可能性。可以通過多種方式觸發:

  • 內存不足時:當JVM檢測到堆內存不足,無法為新的對象分配內存時,會自動觸發垃圾回收。
  • 手動請求:雖然垃圾回收是自動的,開發者可以通過調用System.gc()或Runtime.getRuntime().gc()建議JVM進行垃圾回收。不過這只是一個建議,并不能保證立即執行。
  • JVM參數:啟動java程序時可以通過JVM參數來調整垃圾回收的行為,比如:-Xmx(最大堆大小)、-Xms(初始堆大小)等。
  • 對象數量或內存使用達到閾值:垃圾收集器內部實現了一些策略,以監控對象的創建和內存使用,達到某個閾值時觸發垃圾回收。

2.垃圾判斷方法

  • 引用計數法
    原理:為每個對象分配一個引用計數器,每當有一個地方引用它時,計數器加1;當引用失效時,計數器減1。當計數器為0時,表示對象不再被任何變量引用,可以被回收。
    缺點:不能解決循環引用的問題,即兩個對象相互引用,但不再被其他任何對象引用,這時引用計數器不會為0,導致對象無法被回收
  • 可達性分析法
    原理:從一組稱為GC Roots(垃圾收集根)的對象出發,向下追溯它們引用的對象,以及
    這些對象引用的其他對象,以此類推。如果一個對象到GC Roots沒有任何引用鏈相連(即從GC Roots到這個對象不可達),那么這個對象就被認為是不可達的,可以被回收。
    GCRoos對象包括:虛擬機棧中引用的對象、方法區中類靜態屬性引用的對象、本地方法棧中JNl引用的對象、活躍線程的引用等。
    例:
    class A {B b;
    }
    class B {C c;
    }
    class C {無任何引用
    }
    public class GCTest {public static void main(String[] args) {A a = new A();a.b = new B();a.b.c = new C();// 在此時,a, b, c 這些對象都被 GC Roots 引用,暫時不會被回收。}
    }//若a=null,那么a和gc root引用斷開,那么a、b和c就無法到達gc root,不可達,會被回收。
    

3. 垃圾回收算法

  • 標記-清除算法
    標記清除算法分為“標記”和"清除”兩個階段,首先通過可達性分析,標記出所有需要回收的對象,然后統一回收所有被標記的對象。標記清除算法有兩個缺陷,一是標記和清除的過程效率都不高,二是清除結束后會造成大量的碎片空間。有可能會造成在申請大塊內存的時候因為沒有足夠的連續空間導致再次GC。
  • 復制算法
    為了解決碎片空間的問題,出現了“復制算法”。復制算法的原理是,將內存分成兩塊,每次申請內存時都使用其中的一塊,當內存不夠時,將這一塊內存中所有存活的復制到另一塊上。然后將然后再把已使用的內存整個清理掉。復制算法解決了空間碎片的問題。但是也帶來了新的問題。因為每次在申請內存時只能使用一半的內存空間,內存利用率嚴重不足。
  • 標記-整理算法
    復制算法在GC之后存活對象較少的情況下效率比較高,但如果存活對象比較多時,會執行較多的復制操作,效率就會下降。而老年代的對象在GC之后的存活率就比較高,所以就有人提出了“標記整理算法”。標記整理算法的“標記”過程與”標記-清除算法”的標記過程一致,但標記之后不會直接清理。而是將所有存活對象都移動到內存的一端,移動結束后直接清理掉剩余部分。
  • 分代回收算法
    分代收集是將內存劃分成新生代和老年代。分配的依據是對象的生存周期或者說經歷過的GC次數。對象創建時,一般在新生代申請內存,當經歷一次GC之后如果對還存活,那么對象的年齡+1。當年齡超過一定值(默認是15,可以通過參數XX:MaxTenuringThreshold來設定)后,如果對象還存活,那么該對象會進入老年代。

3. 垃圾回收器

5. 垃圾回收機制

5.1 Minor GC

Minor GC主要負責回收年輕代的垃圾對象。年輕代通常分為三個區域:一個伊甸區和兩個幸存區(一般稱為From區和To區)。當對象被創建時,先被分配到伊甸區。在年輕代的垃圾回收過程中,先對伊甸區進行垃圾回收,將存活的對象復制到一個空閑的幸存區中(通常是From區),同時清空伊甸區。Minor GC會一直重復這樣的過程,直到From區被填滿,則進入To區,To區被填滿之后,則將所有對象移動到老年代中。?

經歷 16 次 Minor GC 還能在新生代中存活的對象,才會被送到老年代,或者Survivor 空間中某個年齡段的對象總大小超過了 Survivor 空間的一半,那么該年齡段及以上年齡段的所有對象都會在下一次垃圾回收時被晉升到老年代。

  • 作用范圍:針對年輕代進行回收,包括Eden區和兩個Survivor區(S0和S1)。
  • 觸發條件:當Eden區空間不足時,JVM觸發一次Young?GC,將Eden區和一個Survivor區中的存活對象移動到另一個Survivor區或老年代。
  • 特點:通常發生的非常頻繁,因為年輕代中對象的生命周期較短,回收效率高,暫停時間相對較短。

5.2?Major GC

Major GC是指對老年代進行的垃圾回收操作。在Java堆內存中,老年代用于存放生命周期較長的對象或者經過多次Minor GC后仍然存活的對象。Major GC的執行時間一般比Minor GC更長,因為它需要處理較多的對象和進行更復雜的內存整理操作。在Major GC期間,應用程序的執行將會暫停,直到垃圾回收操作完成。

  • 作用范圍:針對老年代進行回收,但不一定只回收老年代。
  • 觸發條件:當老年代空間不足時,或者系統檢測到年輕代對象晉升到老年代的速度過快,可能會觸發Major GC。
  • 特點:相比Minor GC,Major GC發生的頻率較低,但每次回收可能需要更長的時間,因為老年代中的對象存活率較高。

5.3?Full GC

當新生代空間不足時,會觸發Minor GC,只清理新生代內存。而老年代空間不足或者為了整理碎片化的內存,會觸發Full GC,對整個堆內存進行回收。

Full GC 可能會導致較長的停頓時間,因為它需要掃描整個堆內存,標記可回收對象,并進行內存整理。這意味著在 Full GC 過程中,應用程序的執行會被暫停。

Full GC 的頻率會受多種因素影響,如堆內存的大小、JVM配置參數、對象分配速度等。如果 Full GC 發生過于頻繁或耗時過長,可能會導致應用程序的性能下降。

  • 作用范圍:對整個堆內存(包括年輕代、老年代以及永久代/元空間)進行回收。
  • 觸發條件:
    1.?直接調用System.gc()或Runtime.getRuntime().gc()方法時,雖然不能保證立即執行,但JVM會嘗試執行Full GC。
    2. Minor GC時,如果存活的對象無法全部放入老年代,或者老年代空間不足以容納存活的對象,則會觸發FuGC,對整個堆內存進行回收。
    3. 當永久代(Java8之前的版本)或元空間(Java8及以后的版本)空間不足時。
  • 特點:Full GC是最昂貴的操作,因為它需要停止所有的工作線程(Stop The World),遍歷整個堆內存來查找和回收不再使用的對象,因此應盡量減少Full GC的觸發。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/921612.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/921612.shtml
英文地址,請注明出處:http://en.pswp.cn/news/921612.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

更智能的零售終端設備管理:合規、安全與高效

目錄 引言:為什么零售連鎖和自助終端需要更智能的設備管理? 典型應用場景 1. 便利店連鎖 2. 大型超市 3. 加油站 4. 自助終端 核心功能,驅動高效與安全 1. 批量配置 2. 定時策略同步 3. 設備狀態監控 4. Kiosk 模式,保…

Elasticsearch:向量搜索過濾 - 保持相關性

作者:來自 Elastic Carlos Delgado 僅執行向量搜索以找到與查詢最相似的結果是不夠的。通常需要過濾來縮小搜索結果。本文解釋了在 Elasticsearch 和 Apache Lucene 中向量搜索的過濾是如何工作的。 Elasticsearch 擁有豐富的新功能,幫助你為自己的用例構…

Linux 性能調優之 OOM Killer 的認知與觀測

寫在前面 博文內容涉及到OOM Killer機制,以及利用 Cgroup/dmesg/BPF 觀測 OOM Killer 事件,包括云原生環境下的 OOM Killer 機制的簡單介紹 這是內存調優的最后一篇,之后會分享一些網絡調優相關內容 理解不足小伙伴幫忙指正 ??,生活加油 我不再將這個世界與我所期待的,塑…

webrtc之高通濾波——HighPassFilter源碼及原理分析

文章目錄前言一、導讀二、高通濾波過程1.HighPassFilter的創建1)HighPassFilter的作用2)開啟條件3)開啟配置2.高通濾波整體過程1)觸發時機2)濾波器創建3)高通濾波過程三、算法實現1.原理1)濾波器…

《sklearn機器學習——聚類性能指數》同質性,完整性和 V-measure

函數:homogeneity_score 參數: labels_true: array-like, shape [n_samples] 樣本的真實標簽。 labels_pred: array-like, shape [n_samples] 樣本的預測標簽。返回值: h: float 同質性得分,在0到1之間,值越大表示聚…

HarmonyOS 應用開發新范式:深入剖析 Stage 模型與 ArkTS 狀態管理

好的,請看這篇關于 HarmonyOS 應用開發中 Stage 模型與 ArkTS 狀態管理的技術文章。 HarmonyOS 應用開發新范式:深入剖析 Stage 模型與 ArkTS 狀態管理 引言 隨著 HarmonyOS 4、5 的發布以及 API 12 的迭代,HarmonyOS 的應用開發范式已經全面…

一個Java的main方法在JVM中的執行流程

一個Java的main方法在JVM中的執行流程可以分為??四大階段??:??加載 -> 鏈接 -> 初始化 -> 執行??。// HelloWorld.java public class HelloWorld {public static void main(String[] args) {String message "Hello, JVM!";System.out.p…

聚焦診斷管理(DM)的傳輸層設計、診斷服務器實現、事件與通信管理、生命周期與報告五大核心模塊

聚焦診斷管理(DM)的傳輸層設計、診斷服務器實現、事件與通信管理、生命周期與報告五大核心模塊,明確 UDS(ISO 14229-1)與 SOVD(ASAM 服務化診斷)的功能邏輯、交互流程及規范性要求(SWS_DM 系列)。 1 UDS 傳輸層(UDS Transport Layer) 作為 DM 與診斷客戶端的 UDS …

關于npm的鉤子函數

一、npm scripts 的生命周期鉤子(Lifecycle Scripts) npm 提供了一些 ??特殊的 script 名稱??,它們是 ??生命周期鉤子??,會在特定時機 ??自動執行??。這些鉤子包括: 1.prepublishOnly(在 npm publish之前執…

167.在Vue3中使用OpenLayers模仿共享單車,判斷點是否放在規劃的電子圍欄內

一、前言大家好,這里分享一個 Vue3 OpenLayers 的小案例: 模仿共享單車的電子圍欄功能,用戶在地圖上繪制停泊點時,系統會自動判斷該點是否在規劃好的電子圍欄內(多邊形或圓形)。這個功能在實際項目中有很大…

鍵盤上面有F3,四,R,F,V,按下沒有反應,維修記錄

打開游戲,按了好幾遍F,結果都沒反應,但是左右上下行走是沒問題的。一臉懵逼???打開鍵盤測試網頁,發現有一列沒反應,F1不是,F1我定義了一個快捷鍵,跟測試沖突了…

8051單片機-成為點燈大師

第三章 成為點燈大師 1. 硬件設計 上一章說到,怎么點亮LED燈,很簡單啊,就是把P2口設置成低電平就行了。接下來讓我們更進一步,完成LED閃爍、流水燈實驗2. 軟件設計 2.1 LED閃爍實驗 為了使LED閃爍,我們自然而然的想到要…

Rust 日志庫完全指南:從入門到精通

GitHub 倉庫: https://github.com/zhouByte-hub/rust-study ? 如果這個項目對您有幫助,請給我一個 star! 在 Rust 生態系統中,日志處理是一個至關重要的環節。無論是開發小型應用還是大型系統,良好的日志記錄都能幫助我們追蹤問題…

【科研繪圖系列】R語言繪制論文合集圖

禁止商業或二改轉載,僅供自學使用,侵權必究,如需截取部分內容請后臺聯系作者! 文章目錄 介紹 數據準備與過濾 統計分析 可視化繪圖 抗藥性分析 系統發育分析 加載R包 數據下載 Supp figure 1 Fig 1a Fig 1c Fig 1d Fig 1e Fig 1f Supp figure 3 Supp figure 4 Supp figure 5…

【c++】從三個類的設計看軟件架構的哲學思考

從三個類的設計看軟件架構的哲學思考 文章目錄從三個類的設計看軟件架構的哲學思考前言一、OP類:系統工程的安全守護者設計特點設計哲學適用場景現實類比二、VarReviser類:版本控制的嚴謹管理者設計特點設計哲學適用場景現實類比三、Model類:…

人工智能優化SEO關鍵詞的實戰策略

本文聚焦智能技術如何革新關鍵詞優化實踐,系統解析提升網站排名的核心路徑。重點探討語義分析如何精準匹配用戶意圖、長尾詞智能挖掘怎樣解鎖高潛力流量,并詳解工具篩選高轉化關鍵詞的五大實用策略。通過實戰案例說明技術如何突破流量增長瓶頸&#xff0…

【c++】c++第一課:命名空間

文章目錄1.C的第?個程序2.命名空間2.1 namespace的價值2.2 namespace的定義2.3 命名空間使?最新的c標準(建議收藏) 1.C的第?個程序 C兼容C語?絕?多數的語法,所以C語?實現的helloworld依舊可以運?,C中需要把定義?件代碼后…

版本發布流程手冊:Release分支規范與Bug分級標準全解析

在軟件交付日益高頻、用戶需求快速迭代的今天,版本發布流程的規范性直接決定了團隊的交付效率、產品質量和用戶滿意度。然而,許多團隊仍面臨以下痛點: 發布混亂:分支管理隨意,代碼沖突頻發;質量失控&#…

什么是CA根證書

CA 根證書(Certificate Authority Root Certificate)是 數字證書體系(PKI,Public Key Infrastructure) 中的核心證書。它有幾個關鍵點:1. 定義 CA(Certificate Authority)&#xff1…

git push -u origin main 這個-u起什么作用

git push -u origin main 里的 -u 等價于 --set-upstream,它的作用是:👉 把本地分支 main 和遠程分支 origin/main 綁定(建立追蹤關系)。🔹 具體效果第一次推送分支時,如果加了 -u:本…