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.mzph.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…