JVM之【GC-垃圾清除算法】

Java虛擬機(JVM)中的垃圾收集算法主要分為以下幾種:

  1. 標記-清除算法(Mark-Sweep)
  2. 復制算法(Copying)
  3. 標記-整理算法(Mark-Compact)
  4. 分代收集算法(Generational Collecting)
  5. G1垃圾收集器(Garbage-First)
  6. ZGC(Z Garbage Collector)
  7. Shenandoah垃圾收集器

1. 標記-清除算法(Mark-Sweep)

原理:

  • 標記階段:從根對象開始,遍歷整個對象圖,標記所有被引用的對象。
  • 清除階段:遍歷整個堆,清除未被標記的對象,釋放其內存。

優點:

  • 直觀,簡單,適用于任何對象圖。

缺點:

  • 內存碎片化嚴重,因為清除階段并不移動對象,導致堆中可能有大量不連續的可用空間,產生內存碎片。
  • 標記和清除階段都需要掃描整個堆,效率較低。
  • GC的時候需要停止整個應用程序,用戶體驗不好
    在這里插入圖片描述

2. 復制算法(Copying)

原理:

  • 將堆分為兩個等大的區域,每次只使用其中一個。當活動對象達到一定比例時,將活動對象復制到另一個區域,然后清空當前區域。
  • 復制過程中保留活動對象,并保持對象的相對位置不變。

優點:

  • 沒有內存碎片問題,因為每次都會在一個新的區域中重新排列對象。
  • 分配速度快,只需分配指針移動。

缺點:

  • 需要兩倍的內存空間,因為要維持兩個區域。
  • 對于存活率高的對象,復制成本高。
  • 只適用于存活對象少的情況/頻繁消亡的情況(非常適合新生代)
    在這里插入圖片描述

3. 標記-整理算法(Mark-Compact)

原理:

  • 標記階段:與標記-清除算法相同。
  • 整理階段:將所有存活的對象壓縮到堆的一端,保持空間的連續性,然后清理邊界以外的內存。

優點:

  • 消除內存碎片問題,因為對象都被壓縮到一端,剩余空間連續。
  • 在整理階段減少了內存分配的復雜度,消除了復制算法翻倍消耗內存的缺點。

缺點:

  • 整理階段涉及大量對象移動,可能會導致較高的性能開銷。
  • 效率其實不如復制算法,在對象移動后,其他地方引用了該對象的話,還需要同步修改對象的引用地址
    在這里插入圖片描述

前面所有這些算法中,并沒有一種算法可以完全替代其他算法,它們都具有自己獨特的優勢和特點。分代收集算法應運而生。

分代收集算法:是基于這樣一個事實:不同的對象的生命周期是不一樣的。因此,不同生命周期的對象可以采取不同的收集方式,以便提高回收效率。一般是把Java堆分為新生代和老年代,這樣就可以根據各個年代的特點使用不同的回收算法,以提高垃圾回收的效率。

在Java程序運行的過程中,會產生大量的對象,其中有些對象是與業務信息相關,比如Http請求中的Session對象、線程、Socket連接,這類對象跟業務直接掛鉤,因此生命周期比較長。但是還有一些對象,主要是程序運行過程中生成的臨時變量,這些對象生命周期會比較短,比如:string對象,由于其不變類的特性,系統會產生大量的這些對象,有些對象甚至只用一次即可回收。

4. 分代收集算法(Generational Collecting)

詳情請移步堆篇章
JVM之【運行時數據區2——堆】
原理:

  • 將堆劃分為不同的代(一般為年輕代和老年代)。
  • 年輕代使用復制算法,老年代使用標記-清除或標記-整理算法。
  • 依據“弱分代假說”,大多數對象很快就會死亡。

優點:

  • 優化了垃圾收集的效率,因為年輕代對象存活率低,收集速度快。
  • 減少了老年代垃圾收集的頻率。

缺點:

  • 需要復雜的調優工作,以確定代大小和收集策略。
  • 在年輕代和老年代之間的對象移動可能會產生額外的開銷。

5. 分區收集算法/G1垃圾收集器(Garbage-First)

  • 一般來說,在相同條件下,堆空間越大,一次Gc時所需要的時間就越長,有關GC產生的停頓也越長。為了更好地控制GC產生的停頓時間,將一塊大的內存區域分割成多個小塊,根據目標的停頓時間,每次合理地回收若干個小區間,而不是整個堆空間,從而減少一次GC所產生的停頓。
  • 分代算法將按照對象的生命周期長短劃分成兩個部分,分區算法將整個堆空間劃分成連續的不同小區間。
  • 每一個小區間都獨立使用,獨立回收。這種算法的好處是可以控制一次回收多少個小區間。

原理:

  • 將堆分為多個區域(regions),分別處理,優先回收垃圾最多的區域。
  • 結合了標記-清除和標記-整理算法,適用于大堆的垃圾收集。

優點:

  • 低暫停時間,適合大堆應用。
  • 可以并行和并發進行垃圾收集,提升性能。

缺點:

  • 相對較復雜的實現和調優。
  • 在某些情況下,性能可能不如其他收集器。

6.Shenandoah垃圾收集器

原理:

  • 以并發標記和并發整理為基礎,最小化垃圾收集對應用線程的影響。
  • 使用并發壓縮技術減少停頓時間。

優點:

  • 低停頓時間,適合延遲敏感應用。
  • 高效處理大堆內存。

缺點:

  • 復雜的實現和調優。
  • 性能可能受限于特定的硬件和JVM版本。

總結

不同垃圾收集算法和垃圾收集器各有優缺點,應根據具體應用需求和硬件環境選擇合適的垃圾收集策略。標記-清除和復制算法比較基礎,適用于小型或簡單應用;分代收集算法適用于大多數常規應用;G1、Shenandoah更適合大內存、低延遲的高性能應用。

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

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

相關文章

vue3+three.js給glb模型設置視頻貼圖

1.在網上下載一個顯示屏或者自己畫一個,在blender中設置好顯示屏的Mesh,UV設置好,這樣方便代碼中添加紋理貼圖。可以讓美術在建模軟件中,先隨機設置一張圖片作為紋理,驗證UV是否設置好 關于如何 在blender中給模型設置UV貼圖百度很多的 // 視頻 import * as THREE from…

MacOS13-將數據庫轉為markdown,docx格式

MacOS13-將數據庫轉為markdown,docx格式 文章目錄 先說踩坑點各種模塊缺失 代碼效果總結參考 先說踩坑點 各種模塊缺失 tkinter mysql 沒錯,你可以直接點擊安裝; 如果還出現報錯 你需要打開終端 pip install mysqlclient再次點進去安…

xcode開發swift允許發送http請求設置

Xcode 現在新建項目默認只支持HTTPS請求,認為HTTP請求不安全,所以不支持。但是開發環境一般都是http模式,所以需要單獨配置才可以訪問。 需要到項目的設置里面,點擊info,如果沒有App Transport Security Setting這一項…

項目優化方案之---實現郵箱用戶登錄

之前的項目中我寫的基于SpringBoot和Vue的全棧項目已經實現了基本的用戶接口開發, 不過其代碼的功能單一,而且寫的也是有不少漏洞(基本就像剛接手的代碼*山一樣) 那之后的幾篇文章都來分享一下如何優化項目(每一章都獨…

Python優化、異常處理與性能提升技巧

Python作為一種高效的編程語言,其靈活性和強大的功能使得它成為了許多開發者的首選。在日常的編程實踐中,掌握一些高效的Python技巧可以極大地提升開發效率和代碼質量。本文將介紹五個關于Python使用技巧,幫助你更加熟練地運用Python解決問題…

JMeter性能測試實現與分析分享

JMeter是由著名開源軟件巨頭Apache組織開發的純Java的壓力測試工具,它即能測試動態服務(WebService),也能測試靜態資源,包括Servlet服務、CGI腳本等,還能測試動態語言服務(PHP、Java、ASP.NET等…

Cocos Creator開發學習路線

1.JavaScript與TypeScript程序設計 由于可以跨平臺發布,同時要能支持h5的游戲,cocos creator選擇了JavaScript與TypeScript來做為它的開發語言,所以我們要先學習JavaScript與TypeScript。TypeScript是基于JavaScript的一個語法糖,運行的時候被編譯為JavaScript,所以我們要…

JVM學習-監控工具(二)

jmap:導出內存映像文件&內存使用情況 基本情況 jmap(JVM Memory Map):一方法獲取dump文件(堆轉儲快照文件,二進制文件),還可以獲取目標Java進程的內存相關信息,包括Java堆各區域的使用情況、堆中對象的統計信息、…

MyBatis學習(二)--MyBatis獲取參數值的兩種方式

1、搭建新的module:mybatis_parameter MyBatis獲取參數值的兩種方式:${}和#{} ${}的本質就是字符串拼接,采用sql拼接,無法防止sql注入 #{}的本質就是占位符賦值 ,采用預編譯 防止sql注入 不同參數使用案例 2、單個字面量類型…

OpenHarmony嵌套類對象屬性變化:@Observed裝飾器和@ObjectLink裝飾器

上文所述的裝飾器僅能觀察到第一層的變化,但是在實際應用開發中,應用會根據開發需要,封裝自己的數據模型。對于多層嵌套的情況,比如二維數組,或者數組項class,或者class的屬性是class,他們的第二…

實時瞳孔分割算法-RITnet論文復現

源代碼在這里RITnet-Github 這個模型比較小眾,我們實驗室使用了官方提供的模型進行瞳孔中心位置提取,以實現視線追蹤,效果很好 一、數據集準備 RITnet也是那一屆openEDS數據集挑戰賽的冠軍模型,openEDS數據集可以從Kaggle上下載&a…

數據結構--關鍵路徑

事件v1-表示整個工程開始(源點:入度為0的頂點) 事件v9-表示整個工程結束(匯點:出度為0的頂點) 關鍵路徑:路徑長度最長的路徑 求解關鍵路徑問題(AOE網) 定義四個描述量 …

網絡網絡層之(6)ICMPv4協議

網絡網絡層之(6)ICMPv4協議 Author: Once Day Date: 2024年6月2日 一位熱衷于Linux學習和開發的菜鳥,試圖譜寫一場冒險之旅,也許終點只是一場白日夢… 漫漫長路,有人對你微笑過嘛… 全系列文章可參考專欄: 通信網絡技術_Once-Day的博客-CS…

華為OD刷題C卷 - 每日刷題 7(字符串分隔(二)、歡樂的周末)

兩段代碼分別解決了兩個不同的問題,下面是對它們的概述: 1、(字符串分隔(二)): 這段代碼是解決“字符串分隔(二)”的問題。它提供了一個Java類Main,其中包含…

Java面試題-Tomcat高級面試題

Tomcat 9相較于之前的版本有哪些主要的新特性? Tomcat 9相較于之前的版本,主要有以下幾個新特性: HTTP/2支持:Tomcat 9引入了對HTTP/2協議的支持,這可以顯著提高網站的性能和安全性。HTTP/2協議允許單個連接上進行多…

多語言for循環遍歷總結

多語言for循環遍歷總結 工作中經常需要遍歷對象,但不同編程語言之間存在一些細微差別。為了便于比較和參考,這里對一些常用的遍歷方法進行了總結。 JAVA 數組遍歷 Test void ArrayForTest() {String[] array {"劉備","關羽", &…

大模型備案項目補貼政策一覽【保持更新】

大模型項目、AI類項目、大模型備案通過后等一籃子財政補貼政策 上海市 加快創新體系構建 1. 提升自主創新水平:對引領大模型發展或取得顛覆性突破的項目,最高給予1000萬元補貼支持。 2. 加強算力資源保障:實施算力伙伴計劃,對…

力扣174題動態規劃:地下城游戲(含模擬面試)

?????? 歡迎來到我的博客。希望您能在這里找到既有價值又有趣的內容,和我一起探索、學習和成長。歡迎評論區暢所欲言、享受知識的樂趣! 推薦:數據分析螺絲釘的首頁 關注微信公眾號 數據分析螺絲釘 免費領取價值萬元的python/java/商業…

Java進階學習筆記36——算法

什么是算法? 解決某個實際問題的過程和方法。 1)導航; 2)滴滴打車; 3)抖音; 不同的算法,效率高、性能好! 在Java中,代碼已經幫我們寫好了,但為…

雪花算法詳解及源碼分析

雪花算法的簡介: 雪花算法用來實現全局唯一ID的業務主鍵,解決分庫分表之后主鍵的唯一性問題,所以就單從全局唯一性來說,其實有很多的解決方法,比如說UUID、數據庫的全局表的自增ID 但是在實際的開發過程中&#xff0…