20 | Scavenge:基于copy的垃圾回收算法
最简单的 copy 算法
- 深入了解
- 翻译
- 解释
- 总结
基于copy的垃圾回收算法Scavenge是本文的重点内容。该算法通过将堆空间分为From空间和To空间,将活跃对象从From空间复制到To空间来进行垃圾回收。文章详细介绍了copy算法的实现过程,包括对象的内存布局、垃圾回收方法以及深度优先遍历和广度优先遍历两种算法用于图的遍历。在实现复制过程中,文章提到了解决重复访问对象和对象引用修改的问题,引入了forwarding指针的概念。此外,文章还介绍了Scavenge算法是简单copy算法的一种改进,通过将To空间分成S0和S1两部分,提升了空间的总体利用率。文章还提到了深度优先搜索和广度优先搜索两种算法的优缺点,以及JDK6以前和JDK8以后JVM使用的不同GC算法。总体来看,基于Copy的GC算法有以下特点:对象之间紧密排列,中间没有空隙,分配内存效率高,回收效率取决于存活对象的多少,内存利用率并不高,需要搬移对象,因此需要业务线程暂停。文章内容深入浅出,适合想要了解垃圾回收算法的读者阅读。
《编程高手必学的内存知识》,新⼈⾸单¥59
全部留言(6)
- 最新
- 精选
- 费城的二鹏通过信号量通知,然后在编译生成的代码中插入检查点。用于检查信号量,判断是否需要停顿。
作者回复: 检查点是对的。这种检查点的机制和信号有点像,都是业务线程要主动去处理。
2021-12-132 - 王建新请问,最后的问题,线程的停止时sleep吗
作者回复: 线程确实是休眠,但我这里问的问题是线程什么时候休眠,怎么样可以使得所有业务线程停下来呢?
2021-12-24 - 李二木safepoint?
作者回复: 是的。但你知道safepoint是怎么发生作用的吗?
2021-12-13 - 送过快递的码农老师,关于这个我有两个疑问 1,this是不是就是对象头部最顶端的内存地址 2,我们在复制算法执行完之后,对象地址发生改变。我们业务线程里面的栈里面的引用,啥时候变更的呢?比如Object obj = new Object(); 这个被多个线程栈里面都有这个地址,这个值更新的问题,是标志的时候,通过记一个列表,然后统一更新的么?这个感觉也挺复杂的
作者回复: 1. this是Java层面的概念。其实我们不应该去管它的地址是什么。但如果你非要使用Unsafe对它进行访问,那么,是的,它指向的是对象头部的地址。 2. 栈上的指针也是在对象拷贝阶段更新的呀。这和普通对象有什么不同呢?都是一个二维指针罢了。并不复杂,它没有什么特别之处。非要说有的话,那就是编译器要操心栈上哪些地方是引用,哪些地方是引用。这就是栈的OopMap,这个由编译器操心。内存管理器是不必操心的。
2021-12-13 - 约书亚看过中村成洋那本《垃圾回收的算法与实现》,这节课的伪代码还是挺熟悉的。 我比较好奇的是,在栈帧的那部分根,是怎么统计出来的,是要在生成机器码的时候加入一个操作,每在栈上或者是寄存器里保存一个值(就是对象的引用)时,同时还要操作某个数据结构来记录一下么?而且在栈帧销毁之前,还要从这个数据结构中将对应引用的数据删除2023-09-09归属地:天津
- 王建新“使用 scanned 指针将非递归的广度优先遍历所需的队列,巧妙地隐藏在了 To 空间中” ---这个不是特别理解,有人能帮忙解答下吗2021-12-243