当前位置: 首页 > news >正文

山西住房与城乡建设部网站加盟网站合作

山西住房与城乡建设部网站,加盟网站合作,南昌网站seo技术厂家,wdcp 防盗链 网站不能打开这部分内容主要是为了稍后介绍各款垃圾收集器时做前置知识铺垫,如果对这部分内容感到枯燥或者疑惑,可以先放下看,等后续遇到要使用它们的实际场景、实际问题时再结合问题,再回来阅读和理解。 记忆集和卡集 前面在分代收集理论那…

这部分内容主要是为了稍后介绍各款垃圾收集器时做前置知识铺垫,如果对这部分内容感到枯燥或者疑惑,可以先放下看,等后续遇到要使用它们的实际场景、实际问题时再结合问题,再回来阅读和理解。

记忆集和卡集

前面在分代收集理论那一节稍微讲到对象不是孤立的,对象之间存在跨代引用。如果还是不大明白,看我下面这个例子:老年代引用年轻代

public class ClassRoomLocalCache {// 静态变量 map,以及 map 中引用的 ClassRoom 类型变量大概熬过默认的 15 次垃圾收集,都会晋升到老年代private static final Map<String,ClassRoom> map = new ConcurrentHashMap<>();public static void addStudent(String classRoomId) {// ......// 运行时,新初始化了一个对象 Student ,对象实例假设在年轻代分配内存// 老年代引用年轻代map.get(classRoomId).getUsers().add(new Student("127", "李华", 22));}@Getterprivate static class ClassRoom {private String id;private String name;private Integer num;private List<Student> users;}@AllArgsConstructorprivate static class Student {private String id;private String name;private Integer age;}}

再回一下前面提到的经验法则三,为什么说跨代引用相对于同代引用来说仅占极少数?

因为存在互相引用关系的两个对象,是应该倾向于同时生存或者同时消亡的。例如上面程序中的这个例子(稍微结合例子解释下)

举个例子,如果某个新生代对象存在跨代引用,由于老年代对象难以消亡,该引用会使得新生代对象在收集时同样得以存活,进而在年龄增长之后晋升到老年代中,这时跨代引用也随即被消除了。 

其实上面说的只是一个经验法则或者说是理论,实际上并没有解决当需要在年轻代gc 时因可能存在跨在引用,为了找出该区域中的存活对象,不得不在固定的GC Roots之外,再额外遍历整个老年代中所有对象来确保可达性分析结果的正确性

事实上并不只是新生代、老年代之间才有跨代引用的问题,所有涉及部分区域收集(Partial GC)行为的垃圾收集器(G1、ZGC)都会面临相同的问题。

可以想一下,如果是你,你会怎么设计解决这个问题?

由于跨代引用占极少数,我想最简单的实现的就是维护一个对象数组,每当有老年代对象引用年轻代对象就把老年代对象存储到这个数组中,然后在年轻代收集时,把这个数组的对象一并加入到gc roots 中去进行扫描。

实际上,JVM 的设计者的思路也大概是这样,就是在收集区域(可以理是新生代)开辟一块小内存维护一个数据结构,这个抽象数据结构用于记录从非收集区域指向收集区域的指针集合,他们称为记忆集。

然而JVM 设计者并没有直接使用如上最简单的实现方案。这种记录全部含跨代引用对象的实现方案,无论是空间占用还是维护成本都相当高昂。而在垃圾收集的场景中,收集器只需要通过记忆集判断出某一块非收集区域是否存在有指向了收集区域的指针就可以了,并不需要了解这些跨代指针的全部细节。那设计者在实现记忆集的时候,他们选择更为粗犷的记录粒度来节省记忆集的存储和维护成本,也就是卡精度的实现方案。

对象精度:每个记录精确到一个对象,该对象里有字段含有跨代指针。 
卡精度:每个记录精确到一块内存区域,该区域内有对象含有跨代指针。

卡精度”所指的是用一种称为“卡表”(Card Table)的方式去实现记忆集,这也是目前最常用的一种记忆集实现形式,一些资料中甚至直接把它和记忆集混为一谈。前面定义中提到记忆集其实是一种“抽象”的数据结构,抽象的意思是只定义了记忆集的行为意图,并没有定义其行为的具体实现。卡表就是记忆集的一种具体实现,它定义了记忆集的记录精度、与堆内存的映射关系等。 (可以对比map 和HashMap)

卡表最简单的形式可以只是一个字节数组,而HotSpot虚拟机确实也是这样做的。以下这行代码是HotSpot默认的卡表标记逻辑:

CARD_TABLE [this address >> 9] = 0;

字节数组CARD_TABLE的每一个元素都对应着其标识的内存区域中一块特定大小的内存块,这个内存块被称作“卡页”(Card Page)。一般来说,卡页大小都是以2的N次幂的字节数,通过上面代码可以看出HotSpot中使用的卡页是2的9次幂,即512字节

img

一个卡页的内存中通常包含不止一个对象,只要卡页内有一个(或更多)对象的字段存在着跨代指针,那就将对应卡表的数组元素的值标识为1,称为这个元素变脏(Dirty),没有则标识为0。在垃圾收集发生时,只要筛选出卡表中变脏的元素,就能轻易得出哪些卡页内存块中包含跨代指针,把它们加入GC Roots中一并扫描。

http://www.yayakq.cn/news/137069/

相关文章:

  • 漳州微网站建设公司哪家好申请备案网站首页
  • 蛋糕 网站 模板网站建设的目的及功能定位
  • 网站系统的软件和硬件接口河南住房和城乡建设网站
  • 松花江避暑城建设网站dedecms妇科医院wap网站模板 v1.0
  • 商城网站前台html模板个性化定制网站
  • 常州个人网站设计哪家企业网站建设好
  • 怎么做家具定制网站中国纪检监察报电子版在线阅读
  • 重庆做网站的程序员待遇qq空间个人网站
  • 做外贸网站注意什么松原市住房和城乡建设厅网站
  • 横山专业做网站建设的公司广州越秀区房价多少钱一平方
  • 展示网站多少钱一个大型集团网站
  • 广东公布最新传染了东营网站建设优化
  • 开个做网站公司wordpress全文检索
  • 网站建设云南苏州有什么好玩的景点
  • 做网站刷流量挣钱吗网站模板建站教程视频教程
  • win10可以自己做网站wordpress微信登录
  • 郑州app开发多少钱公众号排名优化软件
  • 移动wap站点营销网站设计公司排名
  • 六安市裕安区建设局网站wordpress自动分表
  • 免费大型网站网站权限配置
  • 做电影资源缓存网站教程菏泽网站建设哪好
  • 高端网站定制设计公司海珠区手机版网站建设
  • wordperss网站做负载均衡制作高端app开发公司
  • 广元网站建设优化多语言商城网站开发
  • 衡水网站建设制作网站托管要求
  • 中华建设杂志社网站灰色词排名接单
  • 网站建设客户需求表 文库手机网站效果图做多大的
  • 数据来源于网站需如何做脚注做网站基本东西
  • 成都网站关键词商城类网站开发
  • 唐河企业网站制作哪家好wordpress seo主题