搜尋
首頁web前端js教程淺析堆與垃圾回收機制

淺析堆與垃圾回收機制

Jul 03, 2020 am 09:20 AM
垃圾回收機制

這篇文章我們主要關注這些問題::Java程式執行完後,堆中的物件什麼時候會被回收?如何回收?

堆又叫做「GC堆,」由於現在收集器基本上都採用分代收集演算法,所以Java堆還可以細分為:新生代和老年代,比例是1:2;再細緻一點新生代內部又劃分為Eden區、Survivor區,比例為8:1。下圖顯示了堆的結構:

#物件在堆中記憶體的分配是有嚴格規定的,策略為:

  • 物件優先在新生代Eden區分配記憶體;

  • 大物件直接進老年代,主要是長字串和陣列這些需要大量連續記憶體空間的物件;

  • #長期存活的物件進入老年代。 Eden區記憶體不夠時,JVM發起一次MinorGC,物件的年齡加一,預設物件年齡到15時進入老年代;

  • 動態年齡判定。相同年齡所有物件大小的總和大於Survivor 空間的一半,大於等於該年齡的物件進入舊年代

新生代GC指Minor GC,在新生代的進行垃圾回收,頻繁且快速。老年代 GC(Major GC/Full GC)在老年代進行垃圾回收,通常伴隨著至少一次的minor gc。速度慢。 Full GC在以下幾種情況下都會被觸發:

  1. 老年代空間不足;

  2. 方法區空間不足;

  3. 呼叫System.gc(),建議JVM進行full gc;

  4. 長期存活的物件轉入老年代,空間不足;

  5. 沒有足夠的連續空間分配給大物件;

  6. 新生代垃圾回收存活的對象太多,S1放不下,老年代擔保空間不足,擔保空間指的是老年代最大可用的連續空間是否大於新生代所有物件總空間。

  堆裡面幾乎放了所有的對象,那我們怎麼知道這些物件是否還有用呢? JVM提供了兩種方法來判定:

  • #引用計數法:給物件加入一個引用計數器,每次被引用,計數器值加一,引用失效,計數器值減一,當引用數為0時,表示物件不存活。引用計數法無法解決循環引用問題,週志朋老師書裡面有詳細的例子,也是比較容易理解的。

  • 可達性分析法#:以」GC Roots「物件為起始點,就像是樹的根節點,向下搜索,搜尋走過的路徑稱為引用鏈,如果一個物件到GC Roots起始點沒有引用鏈,則此對像不可達,是需要被回收的。 GC Roots是指虛擬機器棧所引用的對象,本地方法棧所引用的對象,方法區靜態屬性所引用的對象,方法區常數引用的對象。

    上面提到了引用,物件的存活都和引用有關,引用型別又分為強引用,軟引用,弱引用,虛引用。
  • 強引用,new出來的對象,垃圾回收器絕不會回收它;
  • ################# ###軟引用,在系統將要發生OMM前會回收這些物件的記憶體;###################弱引用,垃圾收集器工作時只要發現,馬上回收;##################虛引用,形同虛設,任何時候都可能被回收。 ######

實際上可達性分析法判定的不可達物件不會馬上回收,物件真正被回收需要經過兩次標記。第一次標記就是被判定為不可達對象,然後進行一次篩選,篩選條件是此對象是否有必要執行finalize()方法。如果沒有重寫finalize()方法或finalize()方法已經被虛擬機器呼叫過,finalize()方法只會被系統呼叫一次。這兩種情況都是」沒有必要執行的「。如果有必要,這個物件會被放在F-Quene佇列中,由虛擬機器自動建立的低優先權的#Finalizer執行緒去執行finalize()方法。這段期間GC會對F-Quene中的物件進行第二次小規模標記,如果物件仍然沒有被引用,那就會被回收,沒有被篩選的物件不一定會被回收。

#我們已經知道物件什麼時候被回收了,那要如何回收呢?介紹四種最常用的垃圾回收演算法:

  • 標記-清除:先標記需清除的對象,統一回收----效率不高,會產生大量不連續的碎片;

  • 複製演算法:將記憶體分塊,每次只使用一塊,使用完後,將存活的物件複製到另一塊上;

  • 標記整理:先標記存活對象,然後讓所有存活對象向一端移動,直接清理端邊界以外的記憶體;

  • 分代演算法,堆分隊新生代和老年代,新生代每次收集都會有大量的物件死去,選擇複製演算法。老年代存活率比較高,且沒有額外空間進行分配擔保,選擇標記清除或標記整理演算法。

垃圾收集演算法是一種記憶體回收的思想,具體的實作是垃圾收集器。簡單介紹下常用的垃圾收集器:

  • serial序列收集器。單線程,垃圾回收的時候,必須暫停其他工作。新生複製,老年標記整理。簡單又有效率;

  • ParNew 收集器。 serial的多執行緒版本;

  • Parallel Scavenge 收集器,複製演算法的多執行緒收集器。注重吞吐量,cpu運作程式碼時間/cpu耗時總時間。新生複製,老年標記整理;

  • Serial Old 收集器,舊年代版本;

  • Parallel Old 收集器,Parallel Scavenge老年代版本;

  • #CMS 收集器,專注於最短時間停頓。並發收集器,垃圾收集線程與用戶線程(基本上)同時工作。標記清除演算法

關於垃圾收集器更多的細節可以閱讀週志朋老師的書。

推薦教學:《JS教學

以上是淺析堆與垃圾回收機制的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文轉載於:博客园。如有侵權,請聯絡admin@php.cn刪除
JavaScript在行動中:現實世界中的示例和項目JavaScript在行動中:現實世界中的示例和項目Apr 19, 2025 am 12:13 AM

JavaScript在現實世界中的應用包括前端和後端開發。 1)通過構建TODO列表應用展示前端應用,涉及DOM操作和事件處理。 2)通過Node.js和Express構建RESTfulAPI展示後端應用。

JavaScript和Web:核心功能和用例JavaScript和Web:核心功能和用例Apr 18, 2025 am 12:19 AM

JavaScript在Web開發中的主要用途包括客戶端交互、表單驗證和異步通信。 1)通過DOM操作實現動態內容更新和用戶交互;2)在用戶提交數據前進行客戶端驗證,提高用戶體驗;3)通過AJAX技術實現與服務器的無刷新通信。

了解JavaScript引擎:實施詳細信息了解JavaScript引擎:實施詳細信息Apr 17, 2025 am 12:05 AM

理解JavaScript引擎內部工作原理對開發者重要,因為它能幫助編寫更高效的代碼並理解性能瓶頸和優化策略。 1)引擎的工作流程包括解析、編譯和執行三個階段;2)執行過程中,引擎會進行動態優化,如內聯緩存和隱藏類;3)最佳實踐包括避免全局變量、優化循環、使用const和let,以及避免過度使用閉包。

Python vs. JavaScript:學習曲線和易用性Python vs. JavaScript:學習曲線和易用性Apr 16, 2025 am 12:12 AM

Python更適合初學者,學習曲線平緩,語法簡潔;JavaScript適合前端開發,學習曲線較陡,語法靈活。 1.Python語法直觀,適用於數據科學和後端開發。 2.JavaScript靈活,廣泛用於前端和服務器端編程。

Python vs. JavaScript:社區,圖書館和資源Python vs. JavaScript:社區,圖書館和資源Apr 15, 2025 am 12:16 AM

Python和JavaScript在社區、庫和資源方面的對比各有優劣。 1)Python社區友好,適合初學者,但前端開發資源不如JavaScript豐富。 2)Python在數據科學和機器學習庫方面強大,JavaScript則在前端開發庫和框架上更勝一籌。 3)兩者的學習資源都豐富,但Python適合從官方文檔開始,JavaScript則以MDNWebDocs為佳。選擇應基於項目需求和個人興趣。

從C/C到JavaScript:所有工作方式從C/C到JavaScript:所有工作方式Apr 14, 2025 am 12:05 AM

從C/C 轉向JavaScript需要適應動態類型、垃圾回收和異步編程等特點。 1)C/C 是靜態類型語言,需手動管理內存,而JavaScript是動態類型,垃圾回收自動處理。 2)C/C 需編譯成機器碼,JavaScript則為解釋型語言。 3)JavaScript引入閉包、原型鍊和Promise等概念,增強了靈活性和異步編程能力。

JavaScript引擎:比較實施JavaScript引擎:比較實施Apr 13, 2025 am 12:05 AM

不同JavaScript引擎在解析和執行JavaScript代碼時,效果會有所不同,因為每個引擎的實現原理和優化策略各有差異。 1.詞法分析:將源碼轉換為詞法單元。 2.語法分析:生成抽象語法樹。 3.優化和編譯:通過JIT編譯器生成機器碼。 4.執行:運行機器碼。 V8引擎通過即時編譯和隱藏類優化,SpiderMonkey使用類型推斷系統,導致在相同代碼上的性能表現不同。

超越瀏覽器:現實世界中的JavaScript超越瀏覽器:現實世界中的JavaScriptApr 12, 2025 am 12:06 AM

JavaScript在現實世界中的應用包括服務器端編程、移動應用開發和物聯網控制:1.通過Node.js實現服務器端編程,適用於高並發請求處理。 2.通過ReactNative進行移動應用開發,支持跨平台部署。 3.通過Johnny-Five庫用於物聯網設備控制,適用於硬件交互。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱工具

SublimeText3 英文版

SublimeText3 英文版

推薦:為Win版本,支援程式碼提示!

Dreamweaver Mac版

Dreamweaver Mac版

視覺化網頁開發工具

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

EditPlus 中文破解版

EditPlus 中文破解版

體積小,語法高亮,不支援程式碼提示功能