JVM原理及其機制(二)

目錄

一 . 垃圾回收機制(GC)

二 . 垃圾回收的具體步驟?

(1)先找出誰是垃圾?

方案一:引用計數

方案二:可達性分析

(2)釋放垃圾的內存空間?

方案一:標記清除

方案二:復制算法

方案三:標記 — 整理

方案四:分代回收算法


一 . 垃圾回收機制(GC)

在我們上一期講了 Java 在運行時內存的各個區域,對于程序計數器、虛擬機棧、本地方法棧這三個部分區域而言,其生命周期與相關線程有關,隨線程而生,隨線程而滅。并且這三個區域的內存分配與回收具有確定性,因為當方法結束或線程結束時,內存就自然跟著線程回收了,

什么是垃圾回收機制呢?顧名思義,就是清理掉我們在 Java 堆中用完的、不用的對象實例,垃圾回收器在對堆進行垃圾回收前,首先要判斷這些對象哪些還 “ 活著 ”,哪些已經 “ 死去 ” 。

這個垃圾回收機制是很香的,程序員寫代碼放心大膽的 new ,JVM 會自動識別哪些 new 完的對象再也不用了,就會將其自動釋放掉。

像我們主流語言中絕大部分都是內置了 GC 的,例如?GO、Python、PHP、JS ...... 但是我們的C++ 卻不支持 GC ,這是為什么呢?

任何功能都是有代價的,C++ 的大佬們評估了風險之后,不愿意承擔,所以 C++ 并不支持 GC,其主要原因有:要想在JVM 中引入?GC 機制,就需要額外的邏輯,首先會消耗不少的 CPU 開銷,進行垃圾掃描和釋放,其次在進行 GC 的時候可能會觸發 STW(Stop The World)問題,導致程序卡頓。

二 . 垃圾回收的具體步驟?

(1)先找出誰是垃圾?

需要針對每個對象分別判定是否為 “ 垃圾 ”

方案一:引用計數

給每個對象分配一個計數器,這一計數器用來衡量該對象有多少個引用指向。每增加一個引用,計數器 + 1 ,每減少一個引用,計數器 - 1 ,當計數器減為 0 ,此時該對象就是 “ 垃圾?” 了。

但是這個方案在實施過程中存在著一些問題,例如會消耗額外的空間。假設我們 Test 類就只有一個 int 成員(4個字節),為了引入引用計數,少說得搞個 short(2字節),內存就多占了 50% 。其次很可能導致 “ 循環引用 ” 使得判定出錯,這跟我們之前學過的死鎖問題有些相似。循環引用也是有解決方案的,需要引入更多的機制,例如環路檢測(在 Python 中就使用的這種機制),但是這樣一來,代價就更大了。所以綜上所述,Java 并沒有采用這種引用計數的方法,而是另一種:

方案二:可達性分析

可達性分析主要就是 “ 用時間換空間 ” ,在 JVM 中,專門搞了一波線程,周期性的去掃描代碼中的所有對象,來判定每個對象是否 “?可達?”(可以被訪問到),對應的,不可達的對象,就會被視為垃圾。

可達性分析的起點稱為 GC root ,從 root 出發,盡可能的通過 root 訪問到更多的對象,相當于遍歷的過程,但嚴格來說,并不是樹的遍歷,而是圖的遍歷。一個程序中,GC root 不是只有一個,而是有很多很多,可以作為 GC root 的對象有三種:棧上的局部變量(引用類型)、方法區中,靜態成員變量(引用類型)、常量池引用指向的對象。把所有的 GC root 都遍歷一遍,針對每一個盡可能往下延伸。

(2)釋放垃圾的內存空間?

方案一:標記清除

標記清除法就是將需要回收的垃圾標記上,然后直接對其進行清理。

標記清除法主要有兩大缺陷,首先是效率問題,標記和清除這兩個過程效率都不高,其次是空間碎片問題,在清除之后會產生大量不連續的內存碎片,空間碎片太多可能導致以后在程序運行中需要分配較大對象時,就可能申請不了,因為無法找到足夠的連續的空間(申請內存一定是需要連續的空間)。盡量避免內存碎片,時釋放內存的關鍵,所以我們又有了第二種方案:

方案二:復制算法

復制算法就是將我們的內存空間一分為二,每次只使用一半,當我們進行垃圾清理的時候,將不是垃圾的對象拷貝到另一半中,并且確保拷貝的這些對象在這一半內存空間中是連續的,然后直接將原本那一半的內存空間全部釋放掉。

復制算法的缺點也很明顯:首先就是每次只能用一半的內存,內存空間利用率非常低,其次是如果存活下來的對象很多,復制的成本將會非常大。于是我們引入了第三種方案:

方案三:標記 — 整理

標記、整理非常類似與我們之前學習過的順序表,刪除中間元素。當我們需要對垃圾對象進行清理時,依次將還存活的對象往一端移動,將垃圾對象替換掉,最后直接清理掉端邊界以外的內存。

這里需要注意的是,這里對于存活對象搬運的開銷也不少。所以,綜上所述,其實并沒有哪一種方案能做到十全十美,在實際開發過程中,我們都是結合運用,取長補短,于是就有了分代回收:

方案四:分代回收算法

JVM 根據對象的 “ 年齡 ” ,將對象進行區分,年輕的我們叫做新生代,年老的我們稱作老年代。這種 “ 年齡?” 是怎樣劃分的呢?通過我們的可達性分析,周期性的,每次經過一輪的掃描對象仍然存活(不是垃圾),其年齡就 + 1 。

分代回收,是 JVM 的 GC 中的基本思想,當具體落實到 JVM 的實現層面上,JVM 還提供了許多種 “ 垃圾回收器?” ,這些垃圾回收器在具體實施中就會對分代回收做進一步的擴充和實現,如下:

CMS 的原理同樣也是采用分代回收,它的設計理念就是把整個 GC 過程拆分成多個階段,能和業務線程并發執行就盡量并發,從而盡可能的減少 STW 的耗時:

G1 就是把整個內存分成很多個小塊,不同的顏色(字母)就表示這一小塊是新生代(伊甸區 / 幸存區)還是老年區。進行 GC 的時候,不要求一個周期就將其中的所有內存都回收一遍,而是一輪 GC 只回收其中的一部分就好,這樣就可以很好的限制你一輪 GC 所花的時間,這樣就使得?STW 的耗時在一個可控的范圍之內。

OKK,咱們有關 JVM 的原理及其相關機制的內容板塊就說這么多了,這部分主要就是靠被,這些知識就是靠我們去背八股文這種來記,當然了,大家也需要理解記憶,并不是說硬背啦。就這樣吧,咱們下期再見咯,與諸君共勉!!!

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

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

相關文章

Solo:基于 zkHE 的身份驗證協議,構建 Web3 可信匿名身份層

“Solo 正在基于其獨創的 zkHE 架構,構建一套“可信匿名”的鏈上身份系統,有望打破長期困擾 Web3 的“不可能三角”,即在隱私保護、身份唯一性與去中心化可驗證性之間實現兼得。”前不久,Web3 身份層項目 Solo 宣布完成 120 萬美元…

【Excel函數】將數據非空的字段篩選出來放在新列

一、需求描述 將對應數據不為空的字段篩選出來放在新的列里 二、解析 IFERROR(INDEX(B$2:B$10,SMALL(IF(C$2:C$10<>"",ROW(C$2:C$10)-ROW(C$2)1),ROW(A1))),"") 1. IF(C$2:C$10<>"", ROW(C$2:C$10)-ROW(C$2)1) 作用&#xff1a;…

【unity游戲開發入門到精通——組件篇】unity的粒子系統力場 (Particle System Force Field)實現如旋風、吸引力、風吹效果等

文章目錄前言一、參數介紹二、Particle System Force Field 的核心特性三、如何使用1、粒子系統開啟外力選項2、然后再添加粒子系統力場 (Particle System Force Field)即可參考專欄推薦完結前言 Unity的粒子系統是一個非常強大的工具&#xff0c;可以用來創建各種動態效果&am…

JS逆向基礎( AES 解密密文WordArray和Uint8Array實戰②)

1. Uint8Array 就像「快遞柜」 每個格子固定放「1 瓶飲料」(1 字節 = 8 位,范圍 0-255 就像飲料編號) 比如裝了 3 瓶:可樂(編號 255)、雪碧(10)、礦泉水(0) 這是超市通用的標準貨架,任何工具(JS 內置功能)都認識這種擺放方式 用途:運輸、存儲所有二進制東西(圖片…

論文閱讀:《針對多目標優化和應用的 NSGA-II 綜述》一些關于優化算法的簡介

前言 提醒&#xff1a; 文章內容為方便作者自己后日復習與查閱而進行的書寫與發布&#xff0c;其中引用內容都會使用鏈接表明出處&#xff08;如有侵權問題&#xff0c;請及時聯系&#xff09;。 其中內容多為一次書寫&#xff0c;缺少檢查與訂正&#xff0c;如有問題或其他拓展…

Elasticsearch(ES)安裝

docker下安裝ES 拉取鏡像docker pull elasticsearch:7.4.0 創建文件夾 權限賦值 chmod -R 777 /usr/local/docker/es 創建配置 #可訪問IP http.host: 0.0.0.0 # 跨域 http.cors.enabled: true http.cors.allow-origin: "*" 編寫腳本并賦權 首先先返回上一級目錄&…

Pycharm、Python安裝及配置小白教程

本篇博客主要介紹了如何使用工具軟件快速安裝Pycharm和Python并完成基礎配置。 目錄 一、Python與Pycharm是什么&#xff1f; 二、安裝工具軟件 三、安裝Python 四、安裝Pycharm 五、配置Pycharm 1. 基礎設置 2. 配置解釋器 一、Python與Pycharm是什么&#xff1f; …

Redis數據庫入門教程

Redis&#xff08;Remote Dictionary Server&#xff09;是一個開源的、基于內存的高性能鍵值存儲系統&#xff0c;它可以用作數據庫、緩存和消息中間件。本教程將帶你從零開始全面學習Redis&#xff0c;涵蓋基礎概念、安裝配置、數據結構、持久化機制以及與Python的交互等內容…

工業儀表識別(一)環境安裝

儀表識別環境安裝 &#xff11;&#xff0e;cuda cuda 11.8 intall&#xff08;cuda11.8、cuda12.6按照需求安裝&#xff09; ref: https://developer.nvidia.com/cuda-11-8-0-download-archive?target_osLinux&target_archx86_64&DistributionUbuntu&target_vers…

閑庭信步使用圖像驗證平臺加速FPGA的開發:第三十四課——車牌識別的FPGA實現(6)疊加車牌識別的信息

&#xff08;本系列只需要modelsim即可完成數字圖像的處理&#xff0c;每個工程都搭建了全自動化的仿真環境&#xff0c;只需要雙擊top_tb.bat文件就可以完成整個的仿真&#xff0c;大大降低了初學者的門檻&#xff01;&#xff01;&#xff01;&#xff01;如需要該系列的工程…

Windows上用于跨平臺開發的環境工具

1. MSYS2&#xff08;Minimal SYStem 2&#xff09; 一款模擬Unix環境的軟件&#xff0c;可以執行unix命令。通過pacman管理工具&#xff0c;類似Ubuntu上apt-get&#xff0c;RedHat中的yum。 MSYS2最大好處就是能夠在Windows上輕松編譯一些由Unix環境工具鏈開發的工程&#…

【硬件-筆試面試題】硬件/電子工程師,筆試面試題-15,(知識點:DC-DC電源,BUCK電路,鐵損,銅損)

目錄 1、題目 2、解答 選項 A 選項 B 選項 C 選項 D 3、相關知識點 一、紋波 二、感量&#xff08;電感量L&#xff09; 三、開關頻率f 四、鐵損 五、銅損 題目匯總版&#xff1a; 【硬件-筆試面試題】硬件/電子工程師&#xff0c;筆試面試題匯總版&#xff0c;持…

Ethereum: 從 1e+21 到千枚以太幣:解密 Geth 控制臺的余額查詢

大家好今天&#xff0c;我們來聊一個新手在接觸以太坊節點時經常會遇到的場景。想象一下&#xff0c;我們成功運行了一個私有以太坊節點&#xff0c;并嘗試查詢一個賬戶的余額&#xff0c;然后我們看到了這樣一個返回結果&#xff1a;1e21。 這是什么意思&#xff1f;是出錯了&…

2025最新軟件測試面試八股文(含答案+文檔)

&#x1f345; 點擊文末小卡片&#xff0c;免費獲取軟件測試全套資料&#xff0c;資料在手&#xff0c;漲薪更快 1、什么是POM&#xff0c;為什么要使用它&#xff1f;POM是Page Object Model的簡稱&#xff0c;它是一種設計思想&#xff0c;而不是框架。大概的意思是&#xff…

表格數據處理-TabNet模型使用說明(模型構建+SHAP)

一、模型介紹 論文為《TabNet: Attentive Interpretable Tabular Learning》發表于2021年&#xff0c;屬于Google Cloud AI。該研究針對表格數據提出了一種新的深度神經網絡&#xff08;DNN&#xff09;架構TabNet&#xff0c;旨在解決傳統深度學習在表格數據上表現不如決策樹模…

數據集成難在哪?制造企業該怎么做?

目錄 一、為什么你的數據集成總失敗&#xff1f; 1.數據沒有統一標準 2.數據 “斷點多”&#xff0c;打通成本高 3.數據 “用不起來”&#xff0c;價值難落地 二、數據集成的正確做法是什么&#xff1f; 第一步&#xff1a;明確 “集成為了誰”— 用業務目標倒推數據需求…

Datawhale AI數據分析 作業2

學生考試表現影響因素數據集第一步&#xff1a;數據概覽與清洗Prompt 1:加載StudentPerformanceFactors.csv文件&#xff0c;并顯示前5行數據以及各列的數據類型和非空值數量&#xff0c;檢查是否存在缺失值。處理缺失值是數據預處理的重要一步。對于您提到的缺失值&#xff1a…

Flowable 與 Spring Boot 深度集成:從環境搭建到平臺構建

在前三篇文章中&#xff0c;我們依次認識了 Flowable 的基礎概念、用 Modeler 設計流程&#xff0c;以及通過 API 控制流程運行。但在實際項目中&#xff0c;我們更需要將 Flowable 與 Spring Boot 深度融合&#xff0c;構建完整的工作流平臺。本文將從環境配置、設計器集成、權…

Jenkins最新版本的安裝以及集成Allure生成測試報告

目錄 Jenkins的安裝 將上面的目錄添加到系統環境變量中 為Jenkins配置密碼 創建一個用戶&#xff0c;用于登錄jenkins 為Jenkins安裝Allure插件 幾個大坑 使用jenkins集成python測試項目 Jenkins的安裝 Jenkins官方網址 Jenkins 點擊download 點擊 past Release選擇你想要下載…

Vue3 面試題及詳細答案120道 (1-15 )

《前后端面試題》專欄集合了前后端各個知識模塊的面試題&#xff0c;包括html&#xff0c;javascript&#xff0c;css&#xff0c;vue&#xff0c;react&#xff0c;java&#xff0c;Openlayers&#xff0c;leaflet&#xff0c;cesium&#xff0c;mapboxGL&#xff0c;threejs&…