代际垃圾回收器的一种快速Write Barrier算法

论文: A Fast Write Barrier for Generational Garbage Collectors

http://hoelzle.org/publications/write-barrier.pdf

老年代需要记录对新生代的对象引用,以便于新生代GC之后更改老年代相应位置的引用,不然就要扫描整个老年代了。这些标记称为Remembered Set。确保代际的引用位置被标记的机制称为Write Barrier或Store Check。

一般使用Card Marking算法,堆被分为很多card,每个card2^k个word(k=5,6,7),在32位上一般是128,256,或1024字节,每个card一个标记,每个store操作时如果对应card上的对象引用被更改,就把这个card标记,在回收阶段扫描这个card把引用改到最新。开始一个card的标记是一个bit,但性能不佳,改位1个byte,即便如此,内存的额外开销也不大。

初始时的marking需要三个SPARC命令:

st  [%obj + offset], %ptr
add %obj, offset, %temp
sll %temp, k, %temp
st  %g0, [%byte_map + %temp]

为了性能干脆搞成找到修改位置所在对象所在的card,这样只需要两个指令,但回收时候需要多扫描:

st  [%obj + offset], %ptr
sll %obj, k, %temp
st  %g0, [%byte_map + %temp]

marking占总的write barrier时间(还包括清除阶段扫描card)40%-100%,占总的GC开销的40%。

时间: 2024-10-16 18:50:29

代际垃圾回收器的一种快速Write Barrier算法的相关文章

JVM中的G1垃圾回收器

我们先回顾一下主流Java的垃圾回收器(HotSpot JVM).本文是针对堆的垃圾回收展开讨论的. 堆被分解为较小的三个部分.具体分为:新生代.老年代.持久代. 绝大部分新生成的对象都放在Eden区,当Eden区将满,JVM会因申请不到内存,而触发Young GC ,进行Eden区+有对象的Survivor区(设为S0区)垃圾回收,把存活的对象用复制算法拷贝到一个空的Survivor(S1)中,此时Eden区被清空,另外一个Survivor S0也为空.下次触发Young GC回收Eden+S

CLR中垃圾回收器模式

垃圾回收器有2种不同的工作模式,分别为工作站模式(Workstation)和服务器模式(Server),按照GC线程的工作方式,又可以分成并发方式(Concurrent),非并发方式(Non-concurrent). 在工作站模式上,可以运行并发方式和非并发方式,而在服务器模式上,只能运行非并发方式.在.NET4.0后,工作站模式和服务器模式上都引入了另一种新模式,后台GC模式. 无论是在工作站模式还是在服务器模式上,只要是非并发方式都称为阻塞式GC.因为这种方式下,GC运行的时候,都会挂起对应

垃圾回收器的原则

使用过C++的人应该知道,使用new运算符在堆上创建对象的代价是非常高的——不但创建很麻烦,管理也很麻烦.Java也是通过new运算符在堆上创建对象,但是很明显有着较高的速度.这就要归功于垃圾回收器的存在了. C++的堆分配和Java堆分配的不同之处 C++堆的管理是由程序员来负责的,这就意味着,对于一块分配出去的堆内存回收的时候可能已经碎片化了(有的回收,有的还在用),当再次申请空间时,以前空出来的可能不足以存放新创建的对象,这就使得在程序运行过程中内存块会出现这样的“空穴”,造成不必要的内存

快速傅立叶变换算法FFT——图像处理中的数学原理详解22

欢迎关注我的博客专栏"图像处理中的数学原理详解" 全文目录请见 图像处理中的数学原理详解(总纲) http://blog.csdn.net/baimafujinji/article/details/48467225 图像处理中的数学原理详解(已发布的部分链接整理) http://blog.csdn.net/baimafujinji/article/details/48751037 交流学习可加图像处理研究学习QQ群(529549320) 傅立叶变换以高等数学(微积分)中的傅立叶级数为基

在垃圾回收器中有哪几种判断是否需要被回收的几种方法

垃圾回收器在回收垃圾之前第一件事就是判断哪些是可以被回收的对象,如何判断呢?我们可以根据该对象是否还有引用指向它来进行判断,如果有则不能回收,如果没有则可以回收,具体有以下几种算法: 引用计数算法:给对象添加一个引用计数器,每当它被引用一次计数器就加一,当该引用失效时就减一,如果计数器的值为0就表示它要被垃圾收集器作为垃圾收集了.这种算法存在一个问题,就是如果对象之间互相循环引用,他们就不可能被垃圾回收.举个栗子:public class RefrenceCounting {public Obj

V8 JavaScript引擎研究(三)垃圾回收器的实现

V8垃圾回收机制简介 V8垃圾回收器的实现,是V8高效的一个非常重要的原因. V8在运行时自动回收不再需要使用的对象内存,也即是垃圾回收. V8使用了全暂停式(stop-the-world).分代式(generational).精确(accurate)等组合的垃圾回收机制,来确保更快的对象内存分配.更短的垃圾回收时触发的暂停以及没有内存碎片. V8的垃圾回收有如下几个特点: 当处理一个垃圾回收周期时,暂停所有程序的执行. 在大多数垃圾回收周期,每次仅处理部分堆中的对象,使暂停程序所带来的影响降至

【转】V8 之旅: 垃圾回收器

垃圾回收器是一把十足的双刃剑.其好处是可以大幅简化程序的内存管理代码,因为内存管理无需程序员来操作,由此也减少了(但没有根除)长时间运转的程序的内存泄漏.对于某些程序员来说,它甚至能够提升代码的性能. 另一方面,选择垃圾回收器也就意味着程序当中无法完全掌控内存,而这正是移动终端开发的症结.对于JavaScript,程序中没有任何内存管理的可能--ECMAScript标准中没有暴露任何垃圾回收器的接口.网页应用既没有办法管理内存,也没办法给垃圾回收器进行提示. 严格来讲,使用垃圾回收器的语言在性能

深入理解JVM虚拟机3:垃圾回收器详解

JVM GC基本原理与GC算法 微信公众号[Java技术江湖]一位阿里 Java 工程师的技术小站.作者黄小斜,专注 Java 相关技术:SSM.SpringBoot.MySQL.分布式.中间件.集群.Linux.网络.多线程,偶尔讲点Docker.ELK,同时也分享技术干货和学习经验,致力于Java全栈开发!(关注公众号后回复”Java“即可领取 Java基础.进阶.项目和架构师等免费学习资料,更有数据库.分布式.微服务等热门技术学习视频,内容丰富,兼顾原理和实践,另外也将赠送作者原创的Jav

JVM的垃圾回收机制 总结(垃圾收集、回收算法、垃圾回收器)

如果想了解Java内存模型参考:jvm内存模型-和内存分配以及jdk.jre.jvm是什么关系(阿里,美团,京东) 相信和小编一样的程序猿们在日常工作或面试当中经常会遇到JVM的垃圾回收问题,有没有在夜深人静的时候详细捋一捋JVM垃圾回收机制中的知识点呢?没时间捋也没关系,因为小编接下来会给你捋一捋. 一. 技术背景你要了解吧 二. 哪些内存需要回收? 2.1 引用计数算法 2.1.1 算法分析 2.1.2 优缺点 2.1.3 是不是很无趣,来段代码压压惊 2.2 可达性分析算法 2.3 Jav