HotSpot Stop-and-Copy GC
rednaxelafx的Cheney算法的伪代码。如果不用forwarding的话,维护一个旧地址到新地址的映射也可以。
其中重点部分:
void Heap::collect() {
// The from-space contains objects, and the to-space is empty now.
address scanned = _to_space->bottom();
// scavenge objects directly referenced by the root set
foreach (Object** slot in ROOTS) {
process_reference(slot);
}
// breadth-first scanning of object graph
while (scanned < _to_space->top()) {
Object* parent_obj = (Object*) scanned;
foreach (Object** slot in parent_obj->obejct_fields()) {
process_reference(slot);
// note: _to_space->top() moves if any object is newly copied
// into to-space.
}
scanned += parent_obj->size();
}
// Now all live objects will have been evacuated into the to-space,
// and we don't need the data in the from-space anymore.
swap_spaces();
}
Cheney算法的简单优雅之处来自它通过隐式队列来实现广度优先遍历,但它的缺点之一却也在此:广度优先的拷贝顺序使得GC后对象的空间局部性(memory locality)变差了。但是如果要改为真的深度优先顺序就会需要一个栈,无论是隐式(通常意味着递归调用)或者是显式。
HotSpot Seial GC => rednaxelafx的Cheney算法伪代码
* saved mark => scanned
* FastScanClosure => process_reference()
* GenCollectedHeap::gen_process_strong_roots()、SharedHeap::process_strong_roots() => 遍历根集合的循环逻辑
* FastEvacuateFollowersClosure => 遍历扫描队列的循环
* oopDesc::oop_iterate() => 遍历对象的引用类型字段的循环,Object::object_fields()
* DefNewGeneration::copy_to_survivor_space() => 拷贝对象的逻辑,Heap::evacuate()
ParalleScavenge总体过程虽然也是这样,但是因为多线程模型细节复杂很多。除strong reference之外,其他的soft,weak,phantom等reference也要处理。
rednaxelafx的完整回答
http://hllvm.group.iteye.com/group/topic/39376
其他Cheney算法的概述
https://en.wikipedia.org/wiki/Cheney%27s_algorithm
http://www.cs.umd.edu/class/fall2002/cmsc631/cheney/cheney.html
HotSpot Stop-and-Copy GC的更多相关文章
- copy GC 和 mark & compaction GC的算法异同
先标记 然后 copy GC是,对所有child,判断, 如果child没有被访问过,那么拷贝到新地址,child的forwording指向新地址,child标记为已访问,把自己对child的引用改为 ...
- JVM内存模型以及HotSpot的GC策略
概述 想要进一步掌握Java语言,必须要深入了解一下Java程序的运行环境.本文会对JVM的内存模型.Java内存自动管理机制.以及Oracle官方虚拟机HotSpot在GC方面的实现策略进行大概的梳 ...
- GC学习笔记
GC学习笔记 这是我公司同事的GC学习笔记,写得蛮详细的,由浅入深,循序渐进,让人一看就懂,特转到这里. 一.GC特性以及各种GC的选择 1.垃圾回收器的特性 2.对垃圾回收器的选择 2.1 连续 V ...
- 非常详细GC学习笔记
转载:http://blog.csdn.net/fenglibing/article/details/6321453 这是我公司同事的GC学习笔记,写得蛮详细的,由浅入深,循序渐进,让人一看就懂,特转 ...
- 很具体GC学习笔记
GC学习笔记 这是我公司同事的GC学习笔记,写得蛮具体的,由浅入深,循序渐进,让人一看就懂,特转到这里. 一.GC特性以及各种GC的选择 1.垃圾回收器的特性 2.对垃圾回收器的选择 2.1 连续 V ...
- gc学习(转)
一.GC特性以及各种GC的选择 1.垃圾回收器的特性 2.对垃圾回收器的选择 2.1 连续 VS. 并行 2.2 并发 VS. stop-the-world 2.3 压缩 VS. 不压缩 VS. 复制 ...
- JVM原理三-----GC模块,垃圾回收
GC方法:在JVM启动时填入参数(比如:-XX:+UseConcMarkSweepGC ) 算法区分: 1.古老回收算法: Reference Counting ,对象有一个引用,即增加一个计数,删 ...
- Java中9种常见的CMS GC问题分析与解决
1. 写在前面 | 本文主要针对 Hotspot VM 中"CMS + ParNew"组合的一些使用场景进行总结.重点通过部分源码对根因进行分析以及对排查方法进行总结,排查过程会省 ...
- Java中GC的工作原理
转文: 一个优秀的Java程序员必须了解GC的工作原理.如何优化GC的性能.如何与GC进行有限的交互,有一些应用程序对性能要求较高,例如嵌入式系统.实时系统等,只有全面提升内存的管理效率,才能提高整个 ...
- JAVA中的GC机制详解
优秀Java程序员必须了解的GC工作原理 一个优秀的Java程序员必须了解GC的工作原理.如何优化GC的性能.如何与GC进行有限的交互,因为有一些应用程序对性能要求较高,例如嵌入式系统.实时系统等,只 ...
随机推荐
- 【MySQL】Error 1264: out of range value for column
此问题是插入的整型数字超出了范围. 比如设置表格的数据类型:cust_fax integer(10) not null 当插入以下数字的时候会抛出标题所说的错误: insert into databa ...
- 【MySQL】CSV 文件导入MySQL
此问题是前几天整理数据的时候碰到的,数据存在 CSV文件中(200多万记录),通过python 往数据库中导入太慢了,后来使用MySQL 中自带的命令 LOAD DATA INFILE, 30多秒就能 ...
- js排序算法05——快速排序
终于到了传说中的快速排序算法了,快速排序的思想和归并排序一样,都是采用分治思想,不同之处在于归并每次将数组一分为二,最后将小的数组进行比较,合并为大数组.快排是每次找一个主元,也就是基准数,按照这个基 ...
- VS展开当前目录
- asp.net连接MySQL数据库错误-Out of sync with server
问题 网上说:http://wenda.haosou.com/q/1386389928069965 昨晚这个问题真的费了我不少时间(晚上9到凌晨2点),网上找解决方案,然后一个个尝试,没有成功.准备放 ...
- New Concept English there (25)
38w/m 65 One of the most famous sailing ships of the nineteenth century, the Cutty Sark, can still b ...
- svn 图标状态说明
http://blog.csdn.net/coslay/article/details/41980131
- 关于php print_r
print_r (PHP 4, PHP 5, PHP 7) print_r — 打印关于变量的易于理解的信息. 描述¶ bool print_r ( mixed $expression [, bool ...
- 缺少所需的CD/DVD驱动器设备驱动程序
公司买了个服务器想把自带系统win10 改成windows server 2008 于是,我就用我的u盘做了个系统盘(用UltraISO或者别的,网上很多在此不在赘述) 然后改了启动项,进入到系统安装 ...
- vueRouter中scrollBehavior实现滚动固定位置
使用前端路由,当切换到新路由时,想要页面滚到顶部,或者是保持原先的滚动位置,就像重新加载页面那样. vue-router 能做到,而且更好,它让你可以自定义路由切换时页面如何滚动. 注意: 这个功能只 ...