CMS垃圾收集器深入解析

1.CMS的兩種模式與一種特殊策略

1.1Backgroud CMS(沒有并發失敗的情況)

1.1.1并發標記還能被整理成兩個流程

(1)初始標記
(2)并發標記(3)(4)在這個階段發生
(3)并發預處理
(4)可中止的預處理

(5)重新標記
(6)并發清除

1.1.2為什么我們的并發標記細化之后還會額外有兩個流程出現呢?

討論這個問題之前,我們先思考一個問題,假設CMS要進行老年代的垃圾回收,我們如何判斷被年輕代的對象引用的老年代對象是可達對象。

當老年代被回收的時候,我們如何判斷A對象是存活對象。

必須掃描新生代來確定,所以CMS雖然是老年代的垃圾回收器,卻需要掃描新生代的原因。

既然這個時候我需要掃描新生代,那么全量掃描會不會很慢

答:肯定會的 ,但是接踵而來的問題:既然會很慢,我們的停頓時間很長,可是CMS的目標是什么,CMS(Concurrent Mark Sweep)收集器是一種以獲取最短回收停頓時間為目標的收集器。這不是與他的設計理念不一致嗎?

1.1.3那怎么讓我們的回收變快?

肯定是垃圾越少越快。所以我們的CMS想到了一種方式,就是我先進行新生代的垃圾回收,也就是一次young GC,回收完畢之后。是不是我們新生代的對象就變少了,那么我再進行垃圾回收,是不是就變快了。可以通過CMS提供的兩個參數控制垃圾的回收。

CMSScheduleRemarkEdenSizeThreshold             默認值:2M

CMSScheduleRemarkEdenPenetration              默認值:50%

這兩個參數組合起來就是預清理之后,Eden空間使用超過2M的時候啟動可中斷的并發預清理,(CMS-concurrent-abortable-preclean),到Eden空間使用率到達50%的時候中斷(但不是結束),然后進入Remark(重新標記階段)。

1.1.4這里面有個概念,為什么并發預處理前面會有可中斷的意思

可中斷意味著,假設你一直在預處理,預處理是干什么,無非就是去幫你把正式應該處理的前置工作給做了。所以他一定干了很多事情,但是這些事情遲早有個頭,所以就設置了一個時間對他進行打斷。所以,并發預處理的邏輯是當你發生了minor GC  ,我就預處理結束了但是,我怎么知道你什么時候發生minor  GC?

答案是我不知道,垃圾回收是JVM自動調度的,所以我們無法控制垃圾回收,那我不可能無限制的執行下去,總要有個結束時間吧,所以CMS提供了一個參數

CMSMaxAbortablePrecleanTime ,默認為5S

只要到了5S,不管發沒發生Minor GC,有沒有到CMSScheduleRemardEdenPenetration都會中止此階段,進入remark,如果在5S內還是沒有執行Minor GC怎么辦?CMS提供一個參數

CMSScavengeBeforeRemark參數,使remark前強制進行一次Minor GC。

1.2老年代的策略:記憶集解決每次oldGC都要yuongGC的問題

當我們進行young gc時,可作為gc roots的東西除了常見的棧引用、靜態變量、常量、鎖對象、class對象這些常見的之外,如果老年代有對象引用了我們的新生代對象,那么老年代的對象也應該加入gc roots的范圍中,但是如果每次進行young gc我們都需要掃描一次老年代的話,那我們進行垃圾回收的代價實在是太大了,因此我們引入了一種叫做記憶集的抽象數據結構來記錄這種引用關系。

記憶集是一種用于記錄從非收集區域指向收集區域的指針集合的數據結構。

如果我們不考慮效率和成本問題,我們可以用一個數組存儲所有有指針指向新生代的老年代對象。但是如果這樣的話我們維護成本就很好,打個比方,假如所有的老年代對象都有指針指向了新生代,那么我們需要維護整個老年代大小的記憶集,毫無疑問這種方法是不可取的。因此我們引入了卡表的數據結構

1.2.1卡表

記憶集是我們針對于跨代引用問題提出的思想,而卡表則是針對于該種思想的具體實現。(可以理解為記憶集是結構,卡表是實現類)

在hotspot虛擬機中,卡表是一個字節數組,數組的每一項對應著內存中的某一塊連

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

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

相關文章

【pandas數據處理】數據結構

數據結構 Series基于列表創建數據結構自定義元素的行標簽基于字典創建數據結構 DataFrame對象基于列表創建數據結構設置參數來定義行列標簽基于字典 Series 一維數組對象,不僅包含數據元素,還包含一組與數據元素對應的行標簽。 基于列表創建數據結構 …

C++設計模式之工廠模式(下)——抽象工廠模式

抽象工廠模式 介紹示例示例使用運行結果抽象工廠模式的優缺點優點缺點 總結 介紹 抽象工廠模式是一種創建型設計模式,它提供了一種封裝一組相關或相互依賴對象的方式,而無需指定它們具體的類。它允許客戶端使用抽象接口來創建一系列相關的對象&#xff…

Jquery ajax 同步阻塞引起的UI線程阻塞的坑(loading圖片顯示不出來 )

Jquery ajax 同步阻塞引起的UI線程阻塞的坑(loading圖片顯示不出來,layer.load延遲)jax重新獲取數據刷新頁面功能,因為ajax屬于耗時操作,想在獲取數據且加載頁面時顯示加載遮罩層,結果發現了ajax的好多坑。…

Elasticsearch自動清理腳本

腳本 我在data下創建的腳本文件就叫:vi /data/clear_log.sh,內容如下 #!/bin/sh #獲取時間 time=`date +%Y-%m-%d %H:%M:%S` cipan=`df -h| grep sda3` #查詢磁盤使用率 liang=`df -h| grep sda3 |grep -v grep |awk {print $5}|tr -d

【數據結構】一題帶你出師鏈表!

🦄個人主頁:修修修也 🎏所屬專欄:數據結構 ??操作環境:Visual Studio 2022 題目鏈接 138. 隨機鏈表的復制https://leetcode.cn/problems/copy-list-with-random-pointer/ 題目描述 給你一個長度為 n 的鏈表,每個節點包含一個額外增加的隨機…

Make a BESD file from QTLtools output

Make a BESD file from QTLtools output # 根據基因名與變異rsid編號去重 library(tidyverse) library(readxl) qtltoolsnomi <- read_table("qtltoolsnomi.txt",col_names F) qtltoolsnomi %>% distinct(X1,X8, .keep_all TRUE) -> qtltool qtltool …

qml ParticleSystem3D使用介紹

在 Qt Quick 3D 中,ParticleSystem3D 是用來創建和控制3D粒子系統的元素。粒子系統是圖形編程中用于模擬液體、煙霧、火、星空等現象的技術,它通過生成大量小粒子來模擬這些效果。ParticleSystem3D 提供了一個框架,允許開發者定義粒子的各種屬性,如生命周期、速度、顏色、大…

王道p149 9.設樹B是一棵采用鏈式結構存儲的二叉樹,編寫一個把樹 B中所有結點的左、右子樹進行交換的函數。(c語言代碼實現)

本題代碼如下 void swap(tree* t) {if (*t){treenode* temp (*t)->lchild;(*t)->lchild (*t)->rchild;(*t)->rchild temp;swap(&(*t)->lchild);swap(&(*t)->rchild);} } 完整測試代碼 #include<stdio.h> #include<stdlib.h> typed…

C#string.Format的一些使用

C#中的string.Format方法是一個用于格式化字符串的功能強大的方法。它允許您通過將占位符替換為實際的值來創建格式化的字符串。 一、基本語法是&#xff1a; string.Format(format, arg0, arg1, arg2, ...) 其中&#xff0c; format是一個字符串&#xff0c;其中包含要格式…

Java常用類

目錄 包裝類 裝箱和拆箱 包裝類型和String的轉換&#xff0c;包裝類的常用方法 包裝類 裝箱和拆箱 package com.edu.wrapper;public class Interger01 {//演示int<-->Integer的裝箱和拆箱//手動裝箱int n1100;Integer integer new Integer(n1);Integer integer01 In…

HCIP---MPLS---LDP

文章目錄 前言一、pandas是什么&#xff1f;二、使用步驟 1.引入庫2.讀入數據總結 前言 MPLS 基于標簽轉發表進行轉發&#xff0c;與路由表類似&#xff0c;標簽轉發表有兩種獲取渠道&#xff1a;一是手動配置(類似靜態路由)&#xff0c;二是通過協議自動學習(類似OSPF)。手動配…

6.1.webrc媒體協商

那今天呢&#xff1f;我們來看一下y8 rtc的媒體協商&#xff0c;那實際上在我們之前的課程中呢&#xff1f;我已經向你介紹過y8 rtc的媒體協商了。只不過呢&#xff0c;角度是不一樣的&#xff0c;在之前介紹外邊tc媒體協商的時候呢&#xff0c;我們是從應用的角度來看。那web …

ActiveMQ消息中間件應用場景

一、ActiveMQ簡介 ActiveMQ是Apache出品&#xff0c;最流行的&#xff0c;能力強勁的開源消息總線。ActiveMQ是一個完全支持JMS1.1和J2EE1.4規范的JMS Provide實現。盡管JMS規范出臺已經是很久的事情了&#xff0c;但是JMS在當今的J2EE應用中仍然扮演這特殊的地位。 二、Active…

《第一行代碼:Android》第三版-2.5.4數據類與單例_數據類

本文主要講述數據類&#xff0c;以前用java實現數據類很麻煩&#xff0c;寫很多代碼&#xff0c;就是搭個數據類的框架。kotlin用data class 關鍵字&#xff0c;給你簡化了數據類的創建&#xff0c;比較貼心。 就是自動為你創建了&#xff1a;equals()、hashCode()、toString(…

深入理解JVM 類加載機制

深入理解JVM 類加載機制 虛擬機如何加載Class文件&#xff1f; Class文件中的信息進入到虛擬機后會發生什么變化&#xff1f; 類加載機制就是Java虛擬機把描述類的數據從Class文件加載到內存&#xff0c;并對數據進行校驗、轉換解析和初始化&#xff0c;最終形成可以被虛擬機…

實現點擊一個選框 使得一個組件的可選性修改

實現效果 代碼 html <div class"divrow"><el-checkbox-group v-model"isSendTag" :max"1"><el-checkbox v-for"(item, index) in isSendTagOptions" :key"index" :label"item.value">{{item.…

【C++設計模式】單例模式singleton

C 設計模式–單例模式singleton 單例模式 單例模式是指確保一個類在任何情況下都絕對只有一個實例&#xff0c;并提供一個全局訪問點。 優點&#xff1a;內存中只有一個實例&#xff0c;減少內存開銷&#xff1b;避免對資源多重占用&#xff1b;設置全局訪問點&#xff0c;嚴…

【Axure教程】用中繼器制作卡片多條件搜索效果

卡片設計通過提供清晰的信息結構、可視化吸引力、易擴展性和強大的交互性&#xff0c;為用戶界面設計帶來了許多優勢&#xff0c;使得用戶能夠更輕松地瀏覽、理解和互動。 那今天就教大家如何用中繼器制作卡片的模板&#xff0c;以及完成多條件搜索的效果&#xff0c;我們會以…

并發與并行

并發和并行是操作系統中的兩個重要概念&#xff0c;它們在定義和處理任務的方式上有一些區別。 并發&#xff08;concurrency&#xff09;是指在一段時間內&#xff0c;有多個程序都處于啟動運行到運行完畢之間&#xff0c;但任一時刻點上只有一個程序在處理機上運行。它是一種…

Vue偵聽器

Vue偵聽器是根據組件狀態做DOM更新或者異步更新其他級聯狀態的。計算屬性的主要目標是根據已有數據計算出組件的狀態&#xff0c;它是組件內部的計算&#xff0c;計算結果在組件內部應用。偵聽器的主要目標是根據組件狀態的變動&#xff0c;做級聯的或者異步的操作或DOM更新&am…