JVM中的垃圾回收暫停是什么,為什么會出現暫停,不同的垃圾回收機制暫停對比

JVM中的垃圾回收暫停是什么?

在Java虛擬機(JVM)中,垃圾回收暫停(Garbage Collection Pause),也稱為“Stop-The-World”事件,是指當垃圾收集器執行特定階段時,所有應用程序線程都會被暫時停止,直到該階段完成。這種暫停是為了確保垃圾收集過程能夠正確地識別和回收不再使用的對象而不受到其他線程的干擾。

為什么會出現暫停?

出現暫停的主要原因是為了保證數據一致性:

  1. 標記階段:在許多垃圾收集算法中,如標記-清除(Mark-Sweep)、復制(Copying)、標記-整理(Mark-Compact),都需要首先確定哪些對象是存活的(即仍有引用指向它們),哪些是可以回收的。為了準確地識別這些信息,JVM必須保證在這段時間內沒有其他線程修改對象圖,否則可能會導致錯誤地將存活的對象標記為可回收,或者反之亦然。因此,在標記階段,所有用戶線程會被暫停。
  2. 移動對象:對于某些類型的垃圾收集器,比如那些使用壓縮技術來減少內存碎片化的收集器(例如CMS和G1中的某些模式),它們不僅需要識別哪些對象是活的,還需要移動這些對象以釋放連續的空間。如果在這個過程中允許其他線程繼續運行,則可能導致指針丟失或指向無效位置的問題。為了避免這種情況,也需要暫停所有應用線程。
  3. 并發標記的限制
    盡管有些現代垃圾收集器(如CMS、G1、ZGC等)設計為可以在大部分時間內與應用程序并發運行,但在某些關鍵點上仍然不可避免地需要短暫的停頓。例如,在CMS中,雖然大部分工作可以并行于應用線程進行,但在初始標記和重新標記階段仍需短暫停頓;而在G1中,雖然大多數收集活動都可以并發執行,但最終的清理和部分標記階段也可能需要短暫的STW事件。
  4. 簡化實現:從實現角度來看,完全避免STW事件會使垃圾收集器的設計變得極其復雜。通過引入有限的STW時段,可以使垃圾收集器的設計更加簡單高效,同時也能更好地控制內存管理的準確性。

如何減少GC暫停的影響?

雖然完全消除GC暫停是不可能的,但是可以通過選擇合適的垃圾收集器以及調整其參數來最小化這些暫停的影響:

  • 選擇適當的GC算法:不同的GC算法有不同的特性。例如,G1旨在提供更可預測的停頓時間,并且允許設置最大停頓目標。
  • 優化堆大小:合理配置堆內存大小(-Xms, -Xmx)可以幫助減少頻繁的GC操作,尤其是Full GC的發生頻率。
  • 調整新生代與老年代的比例:適當調整新生代(-XX:NewRatio)的大小有助于減少對象晉升到老年代的速度,從而降低老年代的GC壓力。
  • 使用低延遲GC:像ZGC和Shenandoah這樣的新型垃圾收集器專門設計用于最大限度地減少停頓時間,適合對延遲敏感的應用程序。

不同垃圾回收機制下的暫停對比

不同的垃圾收集器有不同的工作方式,這直接影響了它們如何處理暫停以及暫停的頻率和持續時間。

1. Serial GC
  • 描述:單線程垃圾收集器,適用于單核處理器環境或小型應用。
  • 暫停特性:所有的GC操作都是串行執行的,這意味著每次GC都會導致一次完整的Stop-The-World暫停。由于它是單線程的,所以暫停時間相對較長,尤其是在處理大堆時。
2. Parallel GC
  • 描述:多線程版本的Serial GC,適用于多核處理器上的高吞吐量需求場景。
  • 暫停特性:雖然Young Generation和Old Generation的收集可以并行執行,但仍然涉及Stop-The-World暫停。相比Serial GC,它減少了總的GC暫停時間,因為多個線程同時工作,但是每個暫停事件仍然是全系統的。
3. CMS (Concurrent Mark-Sweep) GC
  • 描述:旨在減少GC停頓時間的老年代收集器,適合響應時間敏感的應用。

  • 暫停特性

    • 初始標記:短暫的STW事件,標記直接從根可達的對象。
    • 并發標記:與應用程序并發進行,不造成停頓。
    • 再標記:另一個短暫停頓,用于修正并發標記期間發生的變動。
    • 并發清除:與應用程序并發進行,清理未被標記為存活的對象。

    盡管大部分工作可以在后臺進行而不影響應用程序,但在初始標記和再標記階段仍會有短暫的暫停。

4. G1 GC
  • 描述:一種區域化的垃圾收集器,旨在提供可預測的低延遲。

  • 暫停特性

    • Young GC:主要針對年輕代,通常具有較短的停頓時間。
    • Mixed GC:包括年輕代和部分老年代的收集,目標是在不超過設定的最大停頓時間內盡可能多地回收垃圾。
    • Full GC:作為最后手段,在G1無法滿足性能目標時觸發,這會導致較長的停頓。

    G1通過分區策略和增量式收集來盡量縮短停頓時間,并允許設置期望的最大停頓時間(-XX:MaxGCPauseMillis)。

5. ZGC
  • 描述:專為低延遲設計的垃圾收集器,支持非常大的堆(TB級別)。
  • 暫停特性:幾乎所有的GC工作都可以并發執行,只有少量且非常短暫的STW事件用于根掃描等關鍵步驟。這些暫停通常在幾毫秒以內,極大地減少了對應用程序的影響。
6. Shenandoah
  • 描述:類似于ZGC,專注于極低的暫停時間,支持大堆大小。
  • 暫停特性:除了極少的、非常短的STW事件外,幾乎所有的工作都可以與應用線程并發執行。Shenandoah通過轉發指針技術解決了并發移動對象的問題,從而實現了更低的暫停時間。

總結

不同的垃圾收集器根據其設計目標提供了不同程度的停頓優化。對于需要最小化GC停頓的應用程序,如實時系統或對響應時間敏感的服務,選擇像ZGC或Shenandoah這樣的現代垃圾收集器可能是最佳選擇。而對于更注重吞吐量的應用,可能更適合使用Parallel GC或CMS。

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

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

相關文章

Spearman 相關系數與 Pearson 相關系數的區別

核心區別對比表特征Pearson 相關系數Spearman 相關系數相關性類型線性相關單調相關計算基礎原始數據值數據排名(秩)公式數據要求連續變量,近似正態分布有序數據或連續變量異常值敏感性高度敏感不敏感取值范圍[-1, 1][-1, 1]單調關系檢測僅檢測…

sqli-labs靶場less36-less40

less361.我們打開靶場之后打開來看一下,輸入的內容會被轉義,依舊是寬字節注入2.使用以下寬字節注入,使用的是%df?id-1%df%27%20union%20select%201,database(),3--3.剩余內容與前面關卡基本一樣,只要使用上面的方法合成寬字節即可…

企業級 TinyMCE Vue 編輯器解決方案 – 配置優化與性能提升指南、自定義插件

## 簡介TinyMCE Vue 是官方提供的 TinyMCE 富文本編輯器的 Vue 組件封裝,支持 Vue 2 和 Vue 3。它讓你可以在 Vue 項目中快速集成強大的富文本編輯能力,支持多種插件、主題和自定義擴展,適用于博客、內容管理、后臺系統等多種場景。主要特性&…

【模電筆記】—— 直流穩壓電源——穩壓電路

Tips:本章節筆記建議讀者綜合學習,內容較多,可謂是模電相當重要的部分,因此部分知識點沒有做到詳細解釋。 1.穩壓電路的性能指標 (同上節直流穩壓電源的主要技術指標【模電筆記】—— 直流穩壓電源——整流、濾波電路…

C++——設計模式

文章目錄一、面向對象的優點和缺點1.1 回答重點1.2 擴展知識二、面向對象的三大特點2.1 回答重點2.2 擴展知識三、設計模式的六大原則3.1 回答重點3.1.1 單一職責原則(Single Responsibility Principle, SRP)3.1.2 開放 - 封閉原則(Open-Clos…

Android PDFBox 的使用指南

Android PDFBox 使用指南 概述 PDFBox是一個強大的PDF處理庫,在Android平臺上也有對應的實現。本指南將介紹如何在Android項目中使用PDFBox進行PDF文件的加載、讀取、修改等操作。 依賴配置 在 app/build.gradle 中添加PDFBox依賴: dependencies {i…

TFTP: Linux 系統安裝 TFTP,文件系統啟動后TFTP使用

安裝 TFTP 服務器 sudo apt update sudo apt install tftpd-hpa配置 TFTP 服務器 編輯配置文件 /etc/default/tftpd-hpa: sudo nano /etc/default/tftpd-hpa 修改內容如下: TFTP_USERNAME"tftp" TFTP_DIRECTORY"/srv/tftp" TFTP_ADD…

昇思+昇騰開發板+DeepSeek模型LoRA微調

昇思昇騰開發板DeepSeek模型LoRA微調 LoRA微調原理核心思想:凍結預訓練模型權重,僅訓練橙色的低秩適配矩陣(A/B矩陣)優勢: 訓練參數量減少至全量微調的0.5%顯存占用降低50%以上適配器權重僅需保存3MB(原模型…

計算機網絡:詳解網絡地址的計算步驟

網絡地址計算是網絡規劃與配置的基礎,核心是通過IP地址和子網掩碼確定網絡標識、廣播地址、可用主機范圍等關鍵信息。以下是詳細的計算步驟,配合實例說明(以IPv4為例): 一、明確基礎概念 在計算前,需先明確3個核心概念: IP地址:標識網絡中主機的32位二進制數,通常以…

Spring AI 系列之三十五 - Spring AI Alibaba-Graph框架之MCP

之前做個幾個大模型的應用,都是使用Python語言,后來有一個項目使用了Java,并使用了Spring AI框架。隨著Spring AI不斷地完善,最近它發布了1.0正式版,意味著它已經能很好的作為企業級生產環境的使用。對于Java開發者來說…

FastAPI后端工程化項目記錄

以下是一個使用fastapi上傳視頻的接口,記錄一下工程化后端程序的業務邏輯 重點是代碼如何抽離 項目結構優化 project/ ├── .env # 環境變量配置 ├── app/ │ ├── __init__.py │ ├── main.py # 主應用入口 │ …

令牌桶限流算法

你提供的 Java 代碼實現的是令牌桶限流算法(Token Bucket Algorithm),這是目前最常用、最靈活的限流算法之一。它允許一定程度的“突發流量”,同時又能控制平均速率。下面我將:逐行詳細解釋 TokenBucketLimiter 類的每…

基于springboot的寵物商城設計與實現

管理員:登錄,個人中心,用戶管埋,寵物分類管理,寵物信息管理,留言反饋,寵物論壇,系統管理,訂單管理用戶:寵物信息,寵物論壇,公告信息&a…

Python day36

浙大疏錦行 Python day36. 復習日 本周內容: 如何導入模塊以及庫項目的規范拆分和寫法官方文檔的閱讀MLP神經網絡的訓練在GPU上訓練模型可視化以及推理

【gaussian-splatting】用自己的數據復現高斯潑濺(一)

1.環境準備1.1.下載diff-gaussian-rasterization這里本來沒啥說的,直接從github上下載就行了,但是我踩坑了,下的版本不對,后續運行報錯參數個數對不上,特在此給大家避坑,注意一定要下帶3dgs版本的diff-gaus…

中國移動h10g-01_S905L處理器安卓7.1當貝純凈版線刷機包帶root權限_融合終端網關

下載固件之前請先將主板上的屏蔽罩取下,查看處理器型號 是否為S905L型號,然后再下載固件進行刷機; 本頁面的固件是采用雙公頭數據線進行刷機的哈; 安卓4.4.2版本固件下載地址:點此進行下載 安卓7.1版本固件下載地址…

夜天之書 #110 涓滴開源:Cronexpr 的故事

在年初的一篇關于商業開源的博文當中,我介紹了在開發商業軟件的過程中,衍生出開源公共軟件庫的模式。在那篇博文里面,我只是簡單羅列了相關開源庫的名字及一句話總結。近期,我會結合商業開源實踐的最新進展,對其中一些…

完整的登陸學生管理系統(配置數據庫)

目錄 要求 思路 1. 登錄模塊(LoginFrame.java) 2. 學生信息管理模塊(StudentFrame.java) 3. 數據層(StudentDAO.java) 4. 業務層(StudentService.java / UserService.java) 5…

譯 | 在 Python 中從頭開始構建 Qwen-3 MoE

文章出自:基于 2個Expert 的 MoE 架構分步指南 本篇適合 MoE 架構初學者。文章亮點在于詳細拆解 Qwen 3 MoE 架構,并用簡單代碼從零實現 MoE 路由器、RMSNorm 等核心組件,便于理解內部原理。 該方法適用于需部署高性能、高效率大模型&#x…

Spring Boot + ShardingSphere 分庫分表實戰

🚀Spring Boot ShardingSphere 實戰:分庫分表,性能暴增的終極指南! ? 適用場景:千萬級大表、高并發、讀寫分離場景 ? 核心框架:Spring Boot 3.x ShardingSphere-JDBC 5.4.1 ? 數據庫:MySQL…