JVM垃圾回收

如何確定垃圾

對堆垃圾回收前的第一步就是要判斷哪些對象已經死亡(即不能再被任何途徑使用的對象)

引用計數法

這個方法就是為對象添加計數器來標識引用個數,計數器為 0 的對象就是不可能再被使用的。但是這種方法存在循環引用問題,目前并未被使用。

?可達性分析算法

這個算法的基本思想就是通過一系列的稱為 “GC Roots” 的對象作為起點,從這些節點開始向下搜索,節點所走過的路徑稱為引用鏈,當一個對象到 GC Roots 沒有任何引用鏈相連的話,則證明此對象是不可用的,需要被回收。

那么關鍵是明確哪些是GC Roots:(咱們從頭到尾說一次Java垃圾回收 | Java程序員進階之路)

  • 虛擬機棧(棧幀中的本地變量表)中引用的對象
  • 方法區中類靜態屬性引用的對象
  • 方法區中常量引用的對象
  • 本地方法棧中 JNI(即一般說的 Native 方法)引用的對象

垃圾回收算法

那么知道了內存中哪些對象是垃圾對象,怎么回收呢

標記-清除算法

顧名思義,就是標記垃圾對象,然后清除

標記-清除算法

?復制算法

它可以將內存分為大小相同的兩塊,每次使用其中的一塊。當這一塊的內存使用完后,就將還存活的對象復制到另一塊去,然后再把使用的空間一次清理掉。這樣就使每次的內存回收都是對內存區間的一半進行回收。

復制算法

?問題:

實際使用的空間只有一半; 復制操作會帶來開銷;

標記-整理算法

仍然是先標記,然后會讓所有存活的對象向一端移動,然后直接清理掉端邊界以外的內存。

標記-整理算法

?分代收集算法

只是根據對象存活周期的不同將內存分為幾塊。一般將 Java 堆分為新生代和老年代,這樣我們就可以根據各個年代的特點選擇合適的垃圾收集算法。

比如在新生代中,每次收集都會有大量對象死去,所以可以選擇”標記-復制“算法,只需要付出少量對象的復制成本就可以完成每次垃圾收集。而老年代的對象存活幾率是比較高的,而且沒有額外的空間對它進行分配擔保,所以我們必須選擇“標記-清除”或“標記-整理”算法進行垃圾收集。

垃圾回收器

上面介紹的都是理論算法,實際jvm會實現很多垃圾回收器,以供不同場合使用。

JDK 默認垃圾收集器(使用 java -XX:+PrintCommandLineFlags -version 命令查看):

JDK 8:Parallel Scavenge(新生代)+ Parallel Old(老年代)
JDK 9 ~ JDK20: G1

CMS 收集器

CMS(Concurrent Mark Sweep)收集器是一種以獲取最短回收停頓時間為目標的收集器。它非常符合在注重用戶體驗的應用上使用。

CMS(Concurrent Mark Sweep)收集器是 HotSpot 虛擬機第一款真正意義上的并發收集器,它第一次實現了讓垃圾收集線程與用戶線程(基本上)同時工作。

從名字中的Mark Sweep這兩個詞可以看出,CMS 收集器是一種 “標記-清除”算法實現的,它的運作過程相比于前面幾種垃圾收集器來說更加復雜一些。整個過程分為四個步驟:

初始標記: 暫停所有的其他線程,并記錄下直接與 root 相連的對象,速度很快 ;
并發標記: 同時開啟 GC 和用戶線程,用一個閉包結構去記錄可達對象。但在這個階段結束,這個閉包結構并不能保證包含當前所有的可達對象。因為用戶線程可能會不斷的更新引用域,所以 GC 線程無法保證可達性分析的實時性。所以這個算法里會跟蹤記錄這些發生引用更新的地方。
重新標記: 重新標記階段就是為了修正并發標記期間因為用戶程序繼續運行而導致標記產生變動的那一部分對象的標記記錄,這個階段的停頓時間一般會比初始標記階段的時間稍長,遠遠比并發標記階段時間短
并發清除: 開啟用戶線程,同時 GC 線程開始對未標記的區域做清掃。

CMS 收集器

?


從它的名字就可以看出它是一款優秀的垃圾收集器,主要優點:并發收集、低停頓。但是它有下面三個明顯的缺點:

對 CPU 資源敏感;
無法處理浮動垃圾;
它使用的回收算法-“標記-清除”算法會導致收集結束時會有大量空間碎片產生。
?

G1 收集器

G1 (Garbage-First) 是一款面向服務器的垃圾收集器,主要針對配備多顆處理器及大容量內存的機器. 以極高概率滿足 GC 停頓時間要求的同時,還具備高吞吐量性能特征.

被視為 JDK1.7 中 HotSpot 虛擬機的一個重要進化特征。它具備以下特點:

  • 并行與并發:G1 能充分利用 CPU、多核環境下的硬件優勢,使用多個 CPU(CPU 或者 CPU 核心)來縮短 Stop-The-World 停頓時間。部分其他收集器原本需要停頓 Java 線程執行的 GC 動作,G1 收集器仍然可以通過并發的方式讓 java 程序繼續執行。
  • 分代收集:雖然 G1 可以不需要其他收集器配合就能獨立管理整個 GC 堆,但是還是保留了分代的概念。
  • 空間整合:與 CMS 的“標記-清除”算法不同,G1 從整體來看是基于“標記-整理”算法實現的收集器;從局部上來看是基于“標記-復制”算法實現的。
  • 可預測的停頓:這是 G1 相對于 CMS 的另一個大優勢,降低停頓時間是 G1 和 CMS 共同的關注點,但 G1 除了追求低停頓外,還能建立可預測的停頓時間模型,能讓使用者明確指定在一個長度為 M 毫秒的時間片段內,消耗在垃圾收集上的時間不得超過 N 毫秒。

G1 收集器的運作大致分為以下幾個步驟:

  • 初始標記
  • 并發標記
  • 最終標記
  • 篩選回收

G1 收集器

G1 收集器

G1 收集器在后臺維護了一個優先列表,每次根據允許的收集時間,優先選擇回收價值最大的 Region(這也就是它的名字 Garbage-First 的由來) 。這種使用 Region 劃分內存空間以及有優先級的區域回收方式,保證了 G1 收集器在有限時間內可以盡可能高的收集效率(把內存化整為零)。

?

內存分配和回收的原則

對象優先在 Eden 區分配

大部分對象都是“朝生晚死”,大多數情況下,對象會在新生代 Eden 區中進行分配。當 Eden 區沒有足夠空間進行分配時,虛擬機將發起一次 Minor GC。

長期存活的對象將進入老年代

既然虛擬機采用了分代收集的思想來管理內存,那么內存回收時就必須能識別哪些對象應放在新生代,哪些對象應放在老年代中。為了做到這一點,虛擬機給每個對象一個對象年齡(Age)計數器。

大部分情況,對象都會首先在 Eden 區域分配。如果對象在 Eden 出生并經過第一次 Minor GC 后仍然能夠存活,并且能被 Survivor 容納的話,將被移動到 Survivor 空間(s0 或者 s1)中,并將對象年齡設為 1(Eden 區->Survivor 區后對象的初始年齡變為 1)。

對象在 Survivor 中每熬過一次 MinorGC,年齡就增加 1 歲,當它的年齡增加到一定程度(默認為 15 歲),就會被晉升到老年代中。對象晉升到老年代的年齡閾值,可以通過參數 -XX:MaxTenuringThreshold 來設置。

大對象進入老年代

大對象就是需要大量連續內存空間的對象(比如:字符串、數組)。

大對象直接進入老年代的行為是由虛擬機動態決定的,它與具體使用的垃圾回收器和相關參數有關。大對象直接進入老年代是一種優化策略,旨在避免將大對象放入新生代,從而減少新生代的垃圾回收頻率和成本。

  • G1垃圾回收器會根據-XX:G1HeapRegionSize參數設置的堆區域大小和-XX:G1MixedGCLiveThresholdPercent參數設置的閾值,來決定哪些對象會直接進入老年代。
  • Parallel Scavenge垃圾回收器中,默認情況下,并沒有一個固定的閾值(XX:ThresholdTolerance是動態調整的)來決定何時直接在老年代分配大對象。而是由虛擬機根據當前的堆內存情況和歷史數據動態決定。

常見面試題:

  • 如何判斷對象是否死亡(兩種方法)。
  • 簡單的介紹一下強引用、軟引用、弱引用、虛引用(虛引用與軟引用和弱引用的區別、使用軟引用能帶來的好處)。
  • 如何判斷一個常量是廢棄常量
  • 如何判斷一個類是無用的類
  • 垃圾收集有哪些算法,各自的特點?
  • HotSpot 為什么要分為新生代和老年代?
  • 常見的垃圾回收器有哪些?
  • 介紹一下 CMS,G1 收集器。
  • Minor Gc 和 Full GC 有什么不同呢?

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

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

相關文章

布谷鳥配音:一站式配音軟件

這是一款智能語音合成軟件,可以快速將文字轉換成語音,擁有多種真人模擬發音,可以選擇不同男聲、女聲、童聲,以及四川話、粵語等中文方言和外語配音,并且可對語速、語調、節奏、數字讀法、多音字、背景音等進行全方位設…

less、sass的使用及其區別

CSS預處理器 CSS 預處理器是一種擴展了原生 CSS 的工具,它們添加了一些編程語言的特性,以便更有效地編寫、組織和維護樣式代碼。預處理器允許開發者使用變量、嵌套、函數、混合等功能,從而使 CSS 更具可讀性、可維護性和重用性,特…

學習筆記整理-JS-01-語法與變量

文章目錄 一、語法與變量1. 初識JavaScript2. JavaScript的歷史3. JavaScript與ECMAScript的關系4. JavaScript的體系5. JavaScript的語言風格和特性 二、語法1. JavaScript的書寫位置2. 認識輸出語句3. REPL環境,交互式解析器4. 變量是什么5. 重點內容 一、語法與變…

使用python快速搭建HTTP服務實現局域網網頁瀏覽或文件傳輸

1.使用命令行(CMD)來快速搭建一個HTTP服務器 你可以借助Python的http.server模塊。以下是在命令行中使用Python快速搭建HTTP服務器的步驟: 打開命令提示符(CMD)。 進入你想要共享文件的目錄。使用 cd 命令來切換到目…

二、編寫第一個 Spring MVC 程序

文章目錄 一、編寫第一個 Spring MVC 程序 一、編寫第一個 Spring MVC 程序 代碼示例 創建 maven 項目&#xff0c;以此項目為父項目&#xff0c;在父項目的 pom.xml 中導入相關依賴 <dependencies><dependency><groupId>junit</groupId><artifactI…

分支和循環語句(2)(C語言)

目錄 do...while()循環 do語句的語法 do語句的特點 do while循環中的break和continue 練習 goto語句 do...while()循環 do語句的語法 do 循環語句; while(表達式); do語句的特點 循環至少執行一次&#xff0c;使用的場景有限&#xff0c;所以不是經常使用。 #inc…

【uniapp】uniapp自動導入自定義組件和設置分包:

文章目錄 一、自動導入自定義組件&#xff1a;二、設置分包和預加載&#xff1a; 一、自動導入自定義組件&#xff1a; 【Volar 官網】https://github.com/vuejs/language-tools 二、設置分包和預加載&#xff1a; 【官方文檔】https://uniapp.dcloud.net.cn/collocation…

【服務平臺】Rancher運行和管理Docker和Kubernetes,提供管理生產中的容器所需的整個軟件堆棧

Rancher是一個開源軟件平臺&#xff0c;使組織能夠在生產中運行和管理Docker和Kubernetes。使用Rancher&#xff0c;組織不再需要使用一套獨特的開源技術從頭開始構建容器服務平臺。Rancher提供了管理生產中的容器所需的整個軟件堆棧。  完整軟件堆棧 Rancher是供采用容器的團…

idea添加作者信息

idea添加作者信息 自定義作者信息idea添加作者信息自定義作者信息 自定義作者信息 idea添加作者信息 在idea中&#xff0c;經常會有這些波浪紋提示&#xff0c;放在上面之后會提示添加作者信息,點擊添加作者信息后&#xff0c;但是不是自己想要的 這里提取的話好像沒什么辦法…

JavaWeb課程學習--Day01

HTML 建立css文件&#xff1a; css使用方式&#xff1a; <span>...</span>無語意包裹標簽 css中的三種選擇器&#xff1a; 注意&#xff1a;播放視音頻時要留出播放空間 盒子模型&#xff1a; 表格標簽&#xff1a; 以上表格&#xff1a; 表單標簽&#xff1a; 表…

分布式 - 服務器Nginx:一小時入門系列之動靜分離

文章目錄 1. 動靜分離的好處2. 分離靜態文件3. 修改 Nginx 配置文件4. location 命令修飾符優先級 1. 動靜分離的好處 Apache Tocmat 嚴格來說是一款java EE服務器&#xff0c;主要是用來處理 servlet請求。處理css、js、圖片這些靜態文件的IO性能不夠好&#xff0c;因此&…

ROS學習--HelloWorld的實現(C++)

1.創建工作空間并初始化 mkdir -p 自定義空間名稱/src cd 自定義空間名稱 catkin_make上述命令&#xff0c;首先會創建一個工作空間以及一個 src 子目錄&#xff0c;然后再進入工作空間調用 catkin_make命令編譯。 2.進入 src 創建 ros 包并添加依賴 cd src catkin_create_pk…

蘇紛享首屆生態人脈會成功舉辦,紛享銷客助力伙伴共同發展

近日&#xff0c;紛享銷客&蘇紛享成功舉辦了首屆生態人脈會&#xff0c;該活動于8月3日下午在蘇州東方之門舉行。本次會議匯聚了來自近20家企業的銷售精英&#xff0c;包括金蝶、泛微、夏谷、螞蟻分工、創享、黑湖智造等眾多知名企業。會議秉持著“建立生態、共同發展、深耕…

時間復雜度與空間復雜度的詳解

目錄 1.時間復雜度 2.時間復雜度計算例題 3.空間復雜度 1.時間復雜度 算法中的基本操作的執行次數&#xff0c;為算法的時間復雜度。 如何表達 時間復雜度&#xff1f; 大O的漸進表示法 實際中我們計算時間復雜度時&#xff0c;我們其實并不一定要計算精確的執行次數&#xf…

ArcGIS Pro暨基礎入門、制圖、空間分析、影像分析、三維建模、空間統計分析與建模、python融合、案例應用

GIS是利用電子計算機及其外部設備&#xff0c;采集、存儲、分析和描述整個或部分地球表面與空間信息系統。簡單地講&#xff0c;它是在一定的地域內&#xff0c;將地理空間信息和 一些與該地域地理信息相關的屬性信息結合起來&#xff0c;達到對地理和屬性信息的綜合管理。GIS的…

【數據結構】樹和二叉樹

一、樹的概念及結構 1、樹的概念 樹 是一種非線性的數據結構&#xff0c;它是由n&#xff08;n>0&#xff09;個有限結點組成一個具有層次關系的集合。把它叫做樹是因 為它看起來像一棵倒掛的樹&#xff0c;也就是說它是根朝上&#xff0c;而葉朝下的。 有一個特殊的結點&a…

mysql8.0.3集群搭建

下載mysql安裝包&#xff1a; https://dev.mysql.com/downloads/mysql/5.7.html#downloads 準備環境 1、準備三臺服務器并設置hosts 192.168.236.143 mysql1 192.168.236.144 mysql2 192.168.236.145 mysql32、設置免密登陸 #生成秘鑰 ssh-keygen -t rsa #一直按Enter即可…

php從靜態資源到動態內容

1、從HTML到PHP demo.php:后綴由html直接改為php,實際上當前頁面已經變成了動態的php應用程序腳本 demo.php: 允許通過<?php ... ?>標簽,添加php代碼到當前腳本中 php標簽內部代碼由php.exe解釋, php標簽之外的代碼原樣輸出,仍由web服務器解析 <!DOCTYPE html>…

MySQL數據庫基礎語法

一&#xff0c;數據庫操作 數據庫中不區分大小寫&#xff01;&#xff01;&#xff01; 1.1 顯示數據庫 show databases ; 如圖&#xff1a; 1.2 創建數據庫 create database [ if not exists ]數據庫名 ; 如圖&#xff1a; 1.3 使用數據庫 use 數據庫名 &#xff1b; 如圖&a…

8月13日,每日信息差

1、600余家互聯網企業發出倡議&#xff1a;積極維護防汛救災網絡秩序、截至目前&#xff0c;包括百度、微博、抖音、快手、小紅書、嗶哩嗶哩、阿里、騰訊等8家超大型互聯網平臺在內的600余家企業發出倡議書&#xff0c;唱響了萬眾一心、聚力救災救援的網上主旋律 2、蘇州調整耗…