JVM新生代/老年代垃圾回收器、內存分配與回收策略

新生代垃圾收集器

1. Serial收集器

serial收集器即串行收集器,是一個單線程收集器。

串行收集器在進行垃圾回收時只使用一個CPU或一條收集線程去完成垃圾回收工作,并且會暫停其他的工作線程(stop the world),直至回收完成。適用于運行在client模式下的JVM。

在單CPU年代,串行收集器是默認的垃圾回收器,minor GC和major GC的過程都是用一個線程去處理的。

啟用方式:-XX: +UseSerialGC

2. ParNew收集器

parNew收集器即并行收集器,采用的是多線程方式進行垃圾回收,可以理解為Serial收集器的多線程版本,吞吐量要比串行高很多,是服務器級別的虛擬機默認使用的,用來處理新生代的垃圾回收器。

因為采用的是并行多線程方式,建議在多CPU環境下使用,否則和Serial沒有區別。

啟用方式:-XX: +UseParNewGC

3. Parallel Scavenge收集器

并行的多線程垃圾收集器,采用復制算法進行垃圾回收,非常適合服務器做計算任務時使用。

一般的垃圾回收器是在盡量短的時間內進行垃圾回收,這樣程序與用戶交互的時間間隔比較小,不會出現長時間的卡頓現象。但是Parallel Scavenge更側重于系統的吞吐量,高效的利用CPU,優先處理計算任務,適合交互少、運算多的場景。

通過參數-XX: MaxGcPauseMills設置GC最大停頓時間,通過參數-XX: GCTimeRatio設置吞吐量大小。

啟用方式:-XX: +UseParallelGC

老年代垃圾收集器

1. Serial Old收集器

serial收集器的老年代版本,同樣是單線程收集器、stop the world,使用標記整理算法。

一般啟用方式:
UseSerialGC是Serial + Serial Old
UseParNewGC是ParNew + Serial Old
UseParallelGC是Parallel Scavenge + Serial Old

2. Parallel Old收集器

老年代版本的Parallel Scavenge,使用多線程 + 標記整理算法。
啟用方式:-XX: +UseParallelOldGC

3. CMS垃圾收集器

CMS收集器的主要目的是使垃圾回收造成的停頓時間最短,提高服務響應速度,使用標記清除算法,具有并發收集(用戶線程與垃圾收集并發執行)、低停頓的特點。運行過程分為以下四個步驟:

1.初始標記:stop the world,只是標記一下GC Roots能直接關聯到的對象,速度快

2.并發標記:進行GC RootsTracing過程

3.重新標記:stop the world,修正并發標記期間因用戶程序繼續運行而導致的標記產生變動的那部分對象的標記記錄。這個階段停頓時間相對初始標記時間長,比并發標記時間短

4.并發清除

注意:

1.CMS收集器對CPU資源敏感,這是面向并發程序設計的共性

2.無法處理浮動垃圾(CMS垃圾收集階段,用戶線程仍在運行,因此會有新的垃圾生成,這部分垃圾只能在下一次GC時再清理,即浮動垃圾),可能出現"Concurrent Mode Failure"失敗導致另一次full GC

啟用方式:-XX:+UseConcMarkSweepGC

G1收集器

G1收集器是基于標記整理算法實現的收集器,所以它不會產生內存空間碎片,并且可以精確的控制停頓時間。能讓使用者明確指定在一個長度為M毫秒的時間片段內,消耗在垃圾收集上的時間不得超過N毫秒。

G1的設計原則就是簡單可行的性能調優,只需聲明以下參數即可:
-XX:+UseG1GC -Xmx16g -XX:MaxGCPauseMills=300

其中,-XX:+UseG1GC表明開啟G1收集器,-Xmx16g設置堆內存為16g,-XX:MaxGCPauseMills=300設置GC停頓最大時間為300ms。如果我們需要調優,在內存一定的情況下,可以考慮修改該參數,當然還要根據實際業務場景來處理。

G1取消了堆內結構的新生代、老年代的物理空間劃分,將整個Java堆劃分為大小固定的獨立區域,后臺維護一個優先列表來跟蹤這些區域的垃圾堆積程度,每次根據允許收集的時間,優先回收垃圾最多的區域。

G1中的Humongous區域用于存儲生命周期較短的巨型對象(一個對象所占空間超過了分區容量的50%),如果一個Humongous區無法裝下一個巨型對象,G1會尋找連續的H分區來存儲,如果沒有連續的H區滿足這種情況,有時候會觸發full GC。

G1收集器的運作主要劃分為以下四個步驟:

初始標記:標記GC Roots能直接關聯到的對象,需要停頓線程,但耗時很短

并發標記:從GC Roots開始對堆中對象進行可達性分析,找出存活的對象,這階段耗時較長,但可與用戶程序并發執行

最終標記:修正在并發標記期間因用戶程序繼續運作而導致標記產生變動的那一部分標記記錄

篩選回收:對各個Region的回收價值和成本進行排序,根據用戶所期望的GC停頓時間來制定回收計劃

內存分配與回收策略

對象的內存分配主要是指在Java堆上的分配,通常會優先分配在新生代,然后經歷一系列GC后仍然存活的對象會進入到老年代。少數情況下,一些對象也會直接進入到老年代。

-Xms:設置初始化堆內存,-Xmx設置最大堆內存,設置為相等可防止內存抖動(剩余內存大于70%、小于40%時,自動觸發內存擴大或縮小)

1. 對象會優先分配在新生代

新生代劃分為一個eden區和兩個survivor區(from survivor、to survivor)。初始階段,新創建的對象會分配給eden區。

新生代發生的GC成為minor GC即Young GC,主要分為以下幾個過程:

  1. 隨著eden區存儲的對象不斷增多,當eden區剩余空間無法存儲新生成的對象時會觸發GC

  2. 經過minor GC后仍然存活的對象會進入from survivor區

  3. 當再次觸發GC時,會掃描eden區和from survivor區,對這兩個區域進行垃圾回收,仍然存活的對象會被復制到to survivor區,同時這些存活的對象年齡加1

  4. 清空eden、from survivor區中的對象,并將from survivor和to survivor區互換

  5. 頻繁執行上述過程,當剩余存活對象年齡達到15(默認)時,這些對象會進入老年代,通過參數-XX:MaxTenuringThreshold控制

-Xmn用來設置新生代大小,一般設置為整個堆內存的3/1或者1/4
-XX:NewRatio設置新生代與老年代的堆內存比例
-XX:SurvivorRatio設置eden區和survivor區之間的比例

2. 老年代存儲的對象

發生在老年代的GC是major GC,回收速度會比minor GC慢。

上文已經說明了對象進入老年代的一種情況即長期存活的對象會進入老年代,這里再來看看其他情況:

  1. 大對象直接進入老年代

    大對象需要的連續存儲空間(如數組)大于新生代剩余空間時,會直接進入老年代。

    通過參數-XX:PretenureSizeThreshold設置,大于該參數值的對象會直接進入老年代(避免新生代中大量對象的拷貝,效率低)

    注意:PretenureSizeThreshold參數只對部分垃圾回收器有效,比如Serial和ParNew

  2. 如果survivor區相同年齡所有對象大小的總和大于survivor空間的一半,年齡大于或等于該年齡的對象可以直接進入老年代,無需等到MaxTenuringThreshold設置的年齡

    注意:永久代不屬于堆空間,通過參數-XX:PermSize,-XX:MaxPermSize控制大小

  3. Full GC
    full GC是針對整個Java堆空間進行垃圾回收,包括新生代和老年代,會造成stop world。要盡量避免full GC,它會影響程序的穩定性。

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

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

相關文章

Unity Mirror 多人同步 基礎教程

Unity Mirror 多人同步 基礎教程MirrorNetworkManager(網絡管理器)Configuration:配置Auto-Start Options:自動啟動Scene Management:場景管理Network Info:網絡信息Authentication:身份驗證Pla…

基于紅尾鷹優化的LSTM深度學習網絡模型(RTH-LSTM)的一維時間序列預測算法matlab仿真

目錄 1.程序功能描述 2.測試軟件版本以及運行結果展示 3.部分程序 4.算法理論概述 5.完整程序 1.程序功能描述 紅尾鷹優化的LSTM(RTH-LSTM)算法,是將紅尾鷹優化算法(Red-Tailed Hawk Optimization, RTHO)與長短期…

深度學習“調參”黑話手冊:學習率、Batch Size、Epoch都是啥?

點擊 “AladdinEdu,同學們用得起的【H卡】算力平臺”,注冊即送-H卡級別算力,80G大顯存,按量計費,靈活彈性,頂級配置,學生更享專屬優惠。 引言:從"煉丹"到科學,…

【網絡實驗】-MUX-VLAN

實驗拓撲實驗要求: 在企業網絡中,企業員工和企業客戶可以訪問企業的服務器,對于企業來說,希望員工之間可以互相交流,但是企業用戶之間相互隔離,不能夠訪問。為了實現所有用戶都可以訪問企業服務器&#xff…

Java泛型:類型安全的藝術與實踐指南

Java泛型&#xff1a;類型安全的藝術與實踐指南 前言&#xff1a;一個常見的編譯錯誤 最近在開發中遇到了這樣一個編譯錯誤&#xff1a; Required type: Callable<Object> Provided: SalesPitchTask這個看似簡單的錯誤背后&#xff0c;隱藏著Java泛型設計的深層哲學。今天…

UMI企業智腦 2.1.0:智能營銷新引擎,圖文矩陣引領內容創作新潮流

在數字營銷日益激烈的今天&#xff0c;企業如何在信息洪流中脫穎而出&#xff1f;UMI企業智腦 2.1.0 的發布為企業提供了全新的解決方案。這款智能營銷工具結合了先進的AI技術與數據驅動策略&#xff0c;幫助企業優化營銷流程、提升效率&#xff0c;并通過圖文矩陣實現內容創作…

Lustre Ceph GlusterFS NAS 需要掛載在k8s容器上,數據量少,選擇哪一個存儲較好

在 K8s 容器環境中&#xff0c;數據量 不大的 規模下&#xff0c;Lustre、Ceph、GlusterFS 和 NAS 的選擇需結合性能需求、運維成本、擴展性和K8s 適配性綜合判斷。以下是針對性分析及推薦&#xff1a;一、核心對比與適用場景二、關鍵決策因素1. 性能需求高并發 / 高吞吐&#…

深入解析 Apache Doris 寫入原理:一條數據的“落地之旅”

在日常的數據分析場景中&#xff0c;我們經常會向 Apache Doris 寫入大量數據&#xff0c;無論是實時導入、批量導入&#xff0c;還是通過流式寫入。但你是否想過&#xff1a;一條數據從客戶端發出&#xff0c;到最終穩定落盤&#xff0c;中間到底經歷了哪些步驟&#xff1f; …

基于MATLAB的視頻動態目標跟蹤檢測實現方案

一、系統架構設計 視頻動態目標跟蹤系統包含以下核心模塊&#xff1a; 視頻輸入模塊&#xff1a;支持攝像頭實時采集或視頻文件讀取預處理模塊&#xff1a;灰度轉換、降噪、光照補償目標檢測模塊&#xff1a;背景建模、運動區域提取跟蹤算法模塊&#xff1a;卡爾曼濾波、粒子濾…

【Python】Python文件操作

Python文件操作 文章目錄Python文件操作[toc]1.文件的編碼2.文件打開、讀取&#xff08;r模式&#xff09;、關閉3.文件的寫入&#xff08;w模式&#xff09;4.文件的追加寫入&#xff08;a模式&#xff09;5.綜合案例1.文件的編碼 意義&#xff1a;計算機只能識別0和1&#x…

CES Asia的“五年計劃”:打造與北美展比肩的科技影響力

在全球科技產業版圖中&#xff0c;展會一直是前沿技術展示、行業趨勢探討以及商業合作達成的關鍵平臺。CES Asia&#xff08;亞洲消費電子技術展&#xff09;作為亞洲科技領域的重要展會&#xff0c;近日明確提出其“五年計劃”&#xff0c;目標是打造與北美展會比肩的科技影響…

【計算機網絡 | 第16篇】DNS域名工作原理

文章目錄3.5 域名系統工作原理主機的標識方式&#xff1a;域名 vs IP 地址標識轉換機制&#xff1a;DNS系統因特網的域名系統&#xff1a;層次域名空間&#x1f426;?&#x1f525;頂級域名分類低級域名與管理域名與IP的區別因特網的域名系統&#xff1a;域名服務器&#x1f9…

YASKAWA安川機器人鋁材焊接節氣之道

在鋁材焊接領域&#xff0c;保護氣體的合理使用對焊接質量與成本控制至關重要。安川焊接機器人憑借高精度與穩定性成為行業常用設備&#xff0c;而WGFACS節氣裝置的應用&#xff0c;則為其在鋁材焊接過程中實現高效節氣提供了創新路徑。掌握二者結合的節氣之道&#xff0c;對提…

GooseDB,一款實現服務器客戶端模式的DuckDB

在網上看到韓國公司開發的一款GooseDB&#xff0c; 官方網站對它的介紹是DuckDB? 的功能擴展分支&#xff0c;具有服務器/客戶端、多會話和并發寫入支持&#xff0c;使用 PostgreSQL 有線協議&#xff08;DuckDB?是 DuckDB 基金會的商標&#xff09; 使用也很簡單&#xff…

lesson62:JavaScript對象進化:ES2025新特性深度解析與實戰指南

目錄 一、迭代器輔助方法&#xff1a;對象數據處理的優雅革命 1.1 核心方法與語法 1.2 對象屬性處理實戰 1.3 性能與兼容性考量 二、JSON模塊原生支持&#xff1a;對象加載的范式轉變 2.1 靜態與動態導入語法 2.2 與傳統方案的對比優勢 2.3 典型應用場景 三、Set集合增…

設計模式學習筆記(一)

設計模式學習筆記&#xff08;一&#xff09; 一般說設計模式都是指面向對象的設計模式&#xff0c;因為面向對象語言可以借助封裝、繼承、多態等特性更好的達到復用性、可拓展性、可維護性。 面向對象一般指以類、對象為組織代碼的基本單元&#xff0c;并將封裝、繼承、多態、…

【CSS】一個自適應大小的父元素,如何讓子元素的寬高比一直是2:1

父元素是自適應大小的容器&#xff08;比如 width:100%&#xff09;&#xff0c;我們希望子元素 始終保持 2:1 寬高比&#xff08;比如寬 200px → 高 100px&#xff0c;寬 300px → 高 150px&#xff09;。 有幾種常見解法&#xff1a;? 方法一&#xff1a;CSS aspect-ratio&…

如何搭建redis集群(docker方式非哨兵)

1、redis的配置文件這里要注意&#xff0c;主從的ip不需要我們去設置&#xff0c;只需要設置主從的密碼就可以&#xff0c;然后就是protect-mode&#xff0c;我設置的是no&#xff0c;一定注意不能設置主從。客戶端要訪問&#xff0c;一定要加# 每個節點的 redis.conf 中 clust…

如何學習VBA_3.3.9:利用“搭積木”思想,快速有效地完成你的代碼

我給VBA的定義&#xff1a;VBA是個人小型自動化處理的有效工具。利用好了&#xff0c;可以大大提高自己的勞動效率&#xff0c;而且可以提高數據處理的準確度。我推出的VBA系列教程共九套和一部VBA漢英手冊&#xff0c;現在已經全部完成&#xff0c;希望大家利用、學習。如果您…

JSP程序設計之輸入/輸出對象 — response對象

response對象1.概述2.實例&#xff1a;response對象方法運用&#xff08;1&#xff09;實例一&#xff1a;頁面自動刷新&#xff08;2&#xff09;實例二&#xff1a;實現頁面重定向&#xff0c;具體的代碼&#xff08;3&#xff09;綜合實例&#xff1a;實現登錄并記錄用戶名1…