一文了解JVM的垃圾回收

Java堆內存結構

java堆內存是垃圾回收器管理的主要區域,也被稱為GC堆。

為了方便垃圾回收,堆內存被分為新生代、老年代和永久代。

新創建的對象的內存會在新生代中分配,達到一定存活時長后會移入老年代,而永久代存儲的是類的元數據,在JDK1.8之后永久代被元空間取代,元空間不再位于堆內存中,而是位于本地內存,它們都是方法區的實現。

如何判斷一個對象是垃圾呢?

堆中幾乎存放了所有的對象實例,對堆進行垃圾回收首先是去判斷哪些對象是垃圾。

引用計數法

在對象的對象頭中會維護一個引用計數器,每有一個地方引用它,計數器就會加1,當斷開引用了就會減1,當計數器的值為0時,說明這個對象是個垃圾。

這種方法簡單,效率高,但是會有循環引用的問題。如果一個a對象和b對象之間互相引用,除此之外沒有任何引用,那么ab對象的引用計數器的值都為1,就得不到釋放。

可達性分析算法

以GC Roots對象為起點,向下搜索,節點走過的路勁成為引用鏈,如果一個對象沒有引用鏈可以到達GC Roots對象,那么這個對象就是垃圾。

哪些對象是GC Roots對象?

  • 虛擬機棧中(棧幀中局部變量表)引用的對象
  • 本地方法棧中引用的對象
  • 方法區中的靜態變量和常量引用的對象
  • 同步鎖持有的對象

引用的類型

判斷對象是否是垃圾還與引用的類型有關。

強引用:當我們去new對象的時候,創建的引用就是強引用,如果一個對象具有強引用,垃圾回收器寧愿拋出OOM錯誤也不會回收這個對象。

軟飲用:如果內存充足就不回收,內存不足就會被回收。

弱引用:不管內存充不充足都會被回收。

虛引用:"虛引用"顧名思義,就是形同虛設,與其他幾種引用都不同,虛引用并不會決定對象的生命周期。如果一個對象僅持有虛引用,那么它就和沒有任何引用一樣,在任何時候都可能被垃圾回收。

垃圾回收算法

標記-清除算法

通過可達性分析算法找到存活對象,也就是在GC Roots引用鏈上的對象,標記它們,然后清除未標記的對象。

這種算法的效率較高,而且垃圾回收后有太多內存碎片,如果是數組這種需要連續內存的對象,可能找不到內存空間。

標記-整理算法

找到存活的對象,標記它們,并讓它們向同一端移動,然后清除端邊界之外的內存。

這種算法解決了內存碎片化的問題,但由于要整理,所以效率不高,適合老年代這種垃圾回收頻率不高的場景。

標記-復制算法

標記-復制算法將內存分為相同的兩塊,只使用其中一塊內存,當那一塊內存使用完之后,找到存活的對象,標記它們,然后把它們移到另一塊內存上,再把之前使用的那塊內存全部清除掉。

這種算法效率較高,而且內存沒有碎片化,但是內存使用率太低,只有一半。

分代收集算法

通過對象存活時間的不同將內存分為了新生代和老年代。

其中新生代又分為伊甸園區(eden),幸存者區(S0、S1)。

新創建的對象會被分配到eden區,當eden區內存不足時,會采用標記-復制算法將eden區和
s0區(第一次復制沒有對象)的存活對象復制到s1區,然后清除eden區和s0區的內存。之后又創建對象,當eden又滿了之后就把eden區和s1區的存活對象復制到s0區,清除eden區和s1區的內存。由此循環,如果存活對象多次都沒有被回收,會移到老年代中。

為什么要分代收集?為什么堆要被分為新生代和老年代?
因為這樣可以根據各個年代的特點選擇不同的垃圾回收算法,新生代的對象存活率低,就可以選擇標記-復制算法,復制少量存活對象就可以完成垃圾回收;而老年代對象存活率高,不適合復制算法,采用標記-清除或者標記-整理算法。

什么是Minor GC、Full GC?
當進行垃圾回收的時候,會暫停所有線程去完成垃圾回收。
Minor GC :發生在新生代的垃圾回收,當eden區滿了會觸發,暫停時間較短。
Full GC:對新生代和老年代進行完整的垃圾回收,當老年代內存不足時會觸發,暫停時間長,要盡量避免。

垃圾回收器

Serial垃圾回收器

serial垃圾回收器也叫串行垃圾回收器,是一個單線程的垃圾回收期,進行垃圾回收的時候,會暫停其他所有的線程,直到收集結束。

Parallel垃圾回收器

也叫并行垃圾回收器,使用多線程進行垃圾回收,垃圾回收時也會暫停其余所有的線程。
JDK1.8默認使用此垃圾回收器。

CMS垃圾回收器

也叫并發垃圾回收器,它的暫停時間很短,GC線程和用戶線程并發工作。

CMS垃圾回收器的回收過程分為四個階段:
初始標記:去標記和GC Roots對象直接連接的對象,會暫停其余線程,但時間很短。
并發標記:之后根據引用鏈標記其余的可達對象,不會暫停其余線程。
重新標記:防止在并發標記期間有新對象創建而漏標,會暫停其余線程,暫停時間短。
并發清除:清除未標記的對象,不會暫停其余線程。

G1垃圾回收器

G1垃圾回收器是JDK9之后默認的垃圾回收器。它將內存分為多個區域,每個區域都可以充當eden區,Survivor區,old區,humongous區,其中humongous區專門用于存放大對象。

G1垃圾回收器采用復制算法回收垃圾,主要有兩種回收方式:Young?GC和Mixed GC

G1垃圾回收流程
Young?GC(對年輕代的回收)
首先新創建的對象會被分配到eden區,當eden區內存達到閾值后,觸發Young GC,會選一個空區域作為幸存者區,然后將存活對象復制到幸存者區,并釋放eden區的內存。

? ? ? ? ? ? ? ? ?

當eden再次達到閾值,觸發Young GC,選出一個新的空區域作為幸存者區,將eden區和舊幸存者區的存活對象復制到新幸存者區,并釋放eden和舊幸存者區的內存,當經過多次Yong GC后還存活的對象會被復制到老年代。

Mixed GC(對年輕代和部分老年代的回收)
當老年代的內存達到一個閾值之后,會去并發標記老年代中的存活對象,無需暫停用戶線程。
然后會去重新標記,防止并發標記導致漏標,此時會暫停用戶線程。

之后進行Mixed GC,對年輕代部分老年代進行垃圾回收。對于年輕代,將eden區和舊幸存者區的存活對象復制到新幸存者區,并釋放內存;對于老年代,不會去回收所有的老年代,而是選出存活對象較少的老年代,將它們的存活對象復制到一個新的老年代,然后釋放內存。

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

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

相關文章

SQL子查詢與MyBatis映射

文章目錄 前言1. 數據庫表結構2. MyBatis Mapper XML3. Java 實體類4. 技術點解析5. 執行效果6. 優化建議 前言 提示:這里可以添加本文要記錄的大概內容: 以下是一個結合 SQL 別名、子查詢、MyBatis 字段映射和代碼復用的完整案例,以用戶管…

基于SpringBoot的“校園周邊美食探索及分享平臺”的設計與實現(源碼+數據庫+文檔+PPT)

基于SpringBoot的“校園周邊美食探索及分享平臺”的設計與實現(源碼數據庫文檔PPT) 開發語言:Java 數據庫:MySQL 技術:SpringBoot 工具:IDEA/Ecilpse、Navicat、Maven 系統展示 校園周邊美食探索及分享平臺結構圖…

時間復雜度(Time Complexity)

時間復雜度 1. 什么是時間復雜度? 時間復雜度(Time Complexity)是計算算法執行時間隨輸入規模(n)增長的變化趨勢。它衡量算法的效率,通常使用大 O 記號(Big-O notation)表示&#…

樹莓派:更新源

發行版本 Debian 一直維護著至少三個發行版本:“穩定版(stable)”,“測試版(testing)”和“不穩定版(unstable)”。 發行版目錄 下一代 Debian 正式發行版的代號為 bullseye — 發布…

K8s 1.27.1 實戰系列(八)Service

一、Service介紹 1、Service 的作用與核心功能 Service 是 Kubernetes 中用于抽象一組 Pod 并提供穩定訪問入口的資源。它解決了以下問題: ?Pod IP 不固定:Pod 可能因故障、擴縮容或更新導致 IP 變化,Service 通過 ClusterIP(虛擬 IP)提供固定訪問地址。?負載均衡:自動…

RocketMQ性能優化篇

在分布式消息系統中,RocketMQ以其高性能、高可靠性和高可擴展性而被廣泛應用。然而,為了充分發揮其性能優勢,需要進行一系列的性能測試和優化。本文將從性能測試方法和優化實踐兩個方面,詳細介紹如何對RocketMQ進行性能優化。通過…

CSS 知識點總結1

CSS 知識點總結1 今天寫了兩個頁面,用到的知識點,總結一下 1. Flexbox 布局 display: flex;:啟用 Flexbox 布局,用于創建靈活的容器。flex-direction: column;:將子元素垂直排列。justify-content:控制子元素在主軸…

雙指針算法專題之——復寫零

文章目錄 題目介紹思路分析異地復寫優化為就地復寫 AC代碼 題目介紹 鏈接: 1089. 復寫零 思路分析 那么這道題我們依然可以使用雙指針算法來解決 異地復寫 先不考慮題目的要求,直接就地在原數組上修改,可能不太好想,我們這里可以先在一個…

Python控制語句 ——break和continue

1.以下關于Python循環結構的描述中,錯誤的是() 。 A、break用來結束當前當次語句,但不跳出當前的循環體。 B、遍歷循環中的遍歷結構可以是字符串、文件、組合數據類型和range函數等。 C、Python通過for,while等保留字構建循環結構。 D、continue只結束本次循環。 答案:A。在…

搭建阿里云專有網絡VPC

目錄 一、概述 二、專有網絡vpc 2.1 vpc基本信息 2.2 vpc資源管理 2.3 vpc網段管理 三、交換機 四、NAT網關 4.1 綁定彈性公網IP 4.2 NAT網關信息 4.3 綁定的彈性公網IP 4.4 DNAT 4.5 SNAT 五、彈性公網IP 六、訪問控制ACL(綁定交換機) 6…

阿里巴巴發布 R1-Omni:首個基于 RLVR 的全模態大語言模型,用于情感識別

每周跟蹤AI熱點新聞動向和震撼發展 想要探索生成式人工智能的前沿進展嗎?訂閱我們的簡報,深入解析最新的技術突破、實際應用案例和未來的趨勢。與全球數同行一同,從行業內部的深度分析和實用指南中受益。不要錯過這個機會,成為AI領…

《深度剖析:鴻蒙系統下智能NPC與游戲劇情的深度融合》

在游戲開發領域,鴻蒙系統的崛起為開發者們帶來了前所未有的機遇與挑戰。尤其是在開發基于鴻蒙系統的人工智能游戲時,實現智能NPC的行為邏輯與游戲劇情緊密結合,成為了打造沉浸式游戲體驗的關鍵。 鴻蒙系統作為一款面向全場景的分布式操作系統…

聚劃算!三個模型對比預測!CNN-GRU、GRU、CNN三模型多變量時序光伏功率預測

聚劃算!三個模型對比預測!CNN-GRU、GRU、CNN三模型多變量時序光伏功率預測 目錄 聚劃算!三個模型對比預測!CNN-GRU、GRU、CNN三模型多變量時序光伏功率預測預測效果基本介紹程序設計參考資料 預測效果 基本介紹 CNN-GRU、GRU、CN…

C# 的 ManualResetEvent(線程同步操作) 類詳解

C# 的 ManualResetEvent 類詳解 作用 ManualResetEvent 是用于線程同步操作的類,允許一個或多個線程等待特定信號,以協調多個線程的執行順序。它通過事件通知機制實現,確保線程在收到信號前保持阻塞,直到其他線程顯式發出信號。…

小白學習:提示工程(什么是prompt)

課程鏈接 https://www.bilibili.com/video/BV1PX9iYQEry/?spm_id_from333.337.search-card.all.click 一 什么是提示工程 【提示工程】也叫【指令工程】 prompt就是給大模型發的指令,如“給我講個笑話” 懂得提示工程原理會帶來什么優勢 懂得原理 為什么有的指…

Docker Compose 之詳解(Detailed Explanation of Docker Compose)

Docker Compose 之詳解 當容器數量逐漸增多,你是否感到手忙腳亂?面對復雜的部署場景,是時候祭出神器Docker Compose了!它能幫你優雅地管理多容器應用,一鍵啟動、停止所有服務,不再為復雜的手動操作焦頭爛額…

C語言 —— 此去經年夢浪蕩魂音 - 深入理解指針(卷一)

目錄 1. 內存和地址 2. 指針變量和地址 2.1 取地址操作符(&) 2.2 指針變量 2.3 解引用操作符 (*) 3. 指針的解引用 3.1 指針 - 整數 3.2 void* 指針 4. const修飾指針 4.1 const修飾變量 4.2 const修飾指針變量 5…

【AI】從頭到腳詳解如何創建部署Azure Web App的OpenAI項目

【AI】從頭到腳詳解如何創建部署Azure Web App的OpenAI項目 在Azure Web應用上,您可以使用Python的OpenAI包方便快捷地調用官方API,上傳您的訓練數據,并利用他們的算法進行處理。本教程提供了一個逐步指南,幫助您在Azure Web應用上部署您的OpenAI項目,涵蓋了從資源設置到…

機器視覺工程師紅外相機的選擇:紅外長波工業相機和短波紅外工業相機玄機大總結

紅外長波(LWIR)和短波(SWIR)工業相機在原理、應用場景和技術特點上有顯著差異。以下是它們的對比分析: 1. 波長范圍與成像原理 2. 技術特點 3. 典型應用場景 4. 優缺點對比 LWIR優勢: 無需光照,適用于完全黑暗環境。 直接反映物體溫度分布。 對煙霧、灰塵穿透能力強。…

uni-app學習筆記——自定義模板

一、流程 1.這是一個硬性的流程,只要按照如此程序化就可以實現 二、步驟 1.第一步 2.第二步 3.第三步 4.每一次新建頁面,都如第二步一樣;可以選擇自定義的模版(vue3Setup——這是我自己的模版),第二步的…