HotSpot Stop-and-Copy GC

rednaxelafx的Cheney算法的伪代码。如果不用forwarding的话,维护一个旧地址到新地址的映射也可以。

其中重点部分:

 1 void Heap::collect() {
 2   // The from-space contains objects, and the to-space is empty now.
 3 
 4   address scanned = _to_space->bottom();
 5   
 6   // scavenge objects directly referenced by the root set
 7   foreach (Object** slot in ROOTS) {
 8     process_reference(slot);
 9   }
10 
11   // breadth-first scanning of object graph
12   while (scanned < _to_space->top()) {
13     Object* parent_obj = (Object*) scanned;
14     foreach (Object** slot in parent_obj->obejct_fields()) {
15       process_reference(slot);
16       // note: _to_space->top() moves if any object is newly copied
17       //       into to-space.
18     }
19     scanned += parent_obj->size();
20   }
21 
22   // Now all live objects will have been evacuated into the to-space,
23   // and we don't need the data in the from-space anymore.
24 
25   swap_spaces();
26 }

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

转载于:https://www.cnblogs.com/chenqingyang/p/6436049.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
引用是一个Dockerfile的示例,用于构建Java应用程序的镜像。其中使用了adoptopenjdk:11-jre-hotspot作为基础镜像,并在其中复制了构建好的应用程序文件,并设置了启动命令。这个镜像是基于AdoptOpenJDK 11的,并使用了OpenJDK的基础设施、构建和测试脚本来生成预先构建的二进制文件。 而引用则是一系列关于Java语言基础的教程和示意图,其中提到了JDK的概述、下载过程、安装过程和卸载过程。 回答中没有直接回答到提问中的具体内容"FROM adoptopenjdk:11-jdk-hotspot",因此无法根据提供的引用内容回答该问题。请提供更多的信息以便我可以为您提供准确的答案。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [spring boot 构建项目优化dockerfile](https://blog.csdn.net/qq_34041723/article/details/124153520)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [OpenJDK11U-jdk_x64_windows_hotspot_11.0.9_11.msi](https://download.csdn.net/download/weixin_42072817/13102655)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [Java基础视频教程-深入浅出学Java精华版](https://download.csdn.net/download/weixin_36643308/88226754)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值