写点什么

SGen:Mono 的生代式垃圾收集器

  • 2011-01-27
  • 本文字数:729 字

    阅读完需:约 2 分钟

从 API 角度来看,Mono 正紧紧跟随着.NET 的脚步大踏步前进着,但有个关键领域 Mono 却落后了。Mono 中默认的垃圾收集器采用的是可移植、但却不太精确的 Boehm-Demers-Weiser 保守式垃圾收集器。Boehm 垃圾收集器的主要问题在于无法精确读取寄存器与栈帧。因为无法确定给定值到底是指针还是标量,因此它总是假设给定值是指针,并且将相关联的对象标记为存活状态。这么做不仅会错误导致大块内存无法分配,同时还使得压缩可用空间这项工作变得异常艰难。

SGen(Simple Generational)是 Mono 新一代的垃圾收集器。见名知意,这个持续了两年的项目正尝试替代 Mono 原来的垃圾收集器,它使用精确的分代式(generational)垃圾收集器,类似于.NET 版本的 CLR。SGen 垃圾收集器使用两生代而非.NET 中的三个,但像.NET 一样对于大对象使用独立的堆。

Mono 2.10 之前(现在仍处于预览版),SGen 仍旧是保守的。新版本增加了对托管栈帧的精确收集的支持,这样基本就不会遇到误报的问题了。来自于 p/invoke 调用的非托管栈帧仍旧使用保守的方式扫描。

类似于.NET,SGen 最大的缺陷在于固定对象。如果将对象固定在 SGen 中(想想.NET 中的 0 生代),那么它就无法彻底清除,这会导致内存碎片。由于几个原因,SGen 的这个问题甚至更糟。你不仅需要处理碎片,而且 SGen 需要从这些碎片中分配内存。理想情况下,所有的活动对象都应从 SGen 中复制出来,并且得到重用。

为了解决这些问题,SGen 并不仅仅像.NET 那样检测显示的固定对象。如前所述,对非托管栈帧的保守式扫描会导致对象的固定,这是因为栈中的数字值可能碰巧与内存地址一样。据推测,随着与 p/invoke 调用相关的逻辑变得更加可靠,这将在未来的版本中得到修复。

查看英文原文: SGen: Mono’s Generational Garbage Collector

2011-01-27 02:531455
用户头像

发布了 88 篇内容, 共 262.3 次阅读, 收获喜欢 8 次。

关注

评论

发布
暂无评论
发现更多内容

直播预告|Apache APISIX x KubeSphere 在线 Meetup 来袭

API7.ai 技术团队

APISIX KubeSphere

Qt | 本地存储配置信息 QSettings

YOLO.

qt 10月月更 C++

中软鸿联:集聚智能化能量势场,点燃小家电创新星火

中软国际AIoT开发者社区

智慧家电

重磅 ! Redis+Nginx+JVM+设计模式+Spring全家桶+Dubbo

程序知音

Java 数据库 spring JVM 后端技术

行业大咖秀,第二期开播!

云计算

数据结构学习,串篇(顺序串及算法)

IC00

学习 数据结构 算法 学习笔记 10月月更

公网对讲SDK| 快速搭建公网对讲应用

anyRTC开发者

音视频 监听 快对讲 AI降噪 录音

真机调试设备不够?荣耀云调试帮你忙

荣耀开发者服务平台

开发者 手机 云服务 荣耀 honor

堡垒机推荐厂商当属哪家?为什么?咨询电话多少?

行云管家

网络安全 信息安全 数据安全 堡垒机

springboot + redis多数据源 + jedis集群模式

try catch

redis springboot spring Boot Starter redis cluster redis多数据源

【Go微服务】开发gRPC总共分三步

王中阳Go

微服务 gRPC RPC #go 10月月更

一条 SQL 语句是如何执行的

说故事的五公子

MySQL 数据库 sql

NFT 数据基础设施 NFTScan 的产品介绍【科普】

NFT Research

区块链 NFT 数据基础设施

喜迎华诞,openEuler 22.09 正式发布,与1265名开发者共建面向数字基础设施的开源操作系统

openEuler

开源 开源操作系统 open Euler

ctk流程

留白的艺术

synchronized 和 ReentrantLock 的区别

zarmnosaj

10月月更

都说复盘能力很重要,如何复盘更有效?Superset你值得拥有

王中阳Go

Code Review BI 分析工具 项目复盘 Superset 10月月更

全息投影正在威胁LED显示屏在舞台的地位

Dylan

LED显示屏 led显示屏厂家

STM32L051测试 (五、串口测试 — 与Enocean模块通讯问题)

矜辰所致

stm32 串口通信 STM32L051 10月月更

写个JS深拷贝,面试备用

helloworld1024fd

JavaScript

大学毕业后转行软件测试我后悔了

测吧(北京)科技有限公司

测试

C# ref用法,实现引用传递(地址传递)

IC00

C# 学习 程序员 上位机 10月月更

Qt示例 | 模拟时钟示例 Analog Clock Example

YOLO.

qt 10月月更 C++

开奖啦!看看 9 月月更获奖名单有没有你?

InfoQ写作社区官方

热门活动

MASA Framework的异常处理

MASA技术团队

.net MASA Framewrok MASA

堡垒主机是堡垒机吗?两者有什么关系?

行云管家

网络安全 信息安全 堡垒机 堡垒机主机

电子表格也能做购物车?简单三步就能实现

葡萄城技术团队

前端 在线excel 应用系统 控件

2022互联网母婴行业用户洞察

易观分析

互联网 母婴

从零开始实现一个Promise

helloworld1024fd

JavaScript

手撕常见JS面试题

helloworld1024fd

JavaScript

基于纯前端类Excel表格控件实现在线损益表应用

葡萄城技术团队

前端 Excel 报表

SGen:Mono的生代式垃圾收集器_.NET_Jonathan Allen_InfoQ精选文章