Mono 3 的默认Gc是Sgen

Mono 3现在是默认 GC是SGen 垃圾回收器,垃圾回收器几个性能和扩展性方面的改进,以更好地利用多核处理器硬件。SGen 已移植到 Windows 和 MIPS。

mono 最开始使用的是 Boehm-Demers-Wiser Conservative Garbage Collector ,mono 3.0之前的版本作为默认的垃圾收集器也是这个,Boehm垃圾收集器的主要问题在于无法精确读取寄存器与栈帧。因为无法确定给定值到底是指针还是标量,因此它总是假设给定值是指针,并且将相关联的对象标记为存活状态。这么做不仅会错误导致大块内存无法分配,同时还使得压缩可用空间这项工作变得异常艰难。

后来mono有了自己的 Simple Generational GC , 就是分代式垃圾回收器Sgen,取代了Mono中传统的 Boehm垃圾回收器。文档地址:http://www.mono-project.com/Compacting_GC,它使用精确的分代式(generational)垃圾收集器,类似于.NET版本的CLR。SGen垃圾收集器使用两生代而非.NET中的三个,但像.NET一样对于大对象使用独立的堆。

  1. 分为两代,之前使用 conservative gc..可见其文档的描述。是一种较为落后的实现,没有分代,.NET 的CLR是三代的
  2. 大对象特殊处理,默认大于64KB作为大对象,.NET的大对象是20KB以上,被分配到一个特殊的大对象堆中。该堆中的对象像其它小对象一样可以被finalized和释放。
  3. 小对象采用get_internal_mem/free_internal_mem 进行内存分配处理,大对象使用OS的malloc/free
  4. major collection 的时候采用 mark/sweep
  5. 收集进行时是 “stop the world”
  6. 保守扫描对象
  7. 老一代指向新一代的情况只有下面两种,所以都进行了跟踪:
  • 程序执行中,一个字段进行了赋值
  • 在复制(代移动)过程中,这个对象指向了一个新一代中的对象

Mono 3.2进一步提升了SGen GC,特别是针对下面的场景——

  • 流行对象负载,老一代对象非常欢迎的一些固定新生对象会导致创建很多记忆的集合。为了避免这种情况的发生,流行对象会被作为永恒对象直到下一次主收集。
  • 大规模线程栈负载,这种情况下需要合理地扫描大量大堆栈线程。这在以前通常会把大量压力放到规划阶段,因为它会产生非常大的固定队列。为了避免这种情况,SGen现在会在固定队列上使用哈希过滤,这大大降低了它们的平均大小,并且它会固定主要块而不是个别对象。

Mono 3.0添加了异步支持、改进的SGen垃圾收集器及其他特性

用Xwt构建跨平台应用程序

new Mono GC

SGen – Concurrent Mark

SGen – Concurrency and Evacuation 

Flame Graphs for Instruments 

How sgen rocks

SGen – The Write Barrier

SGen and DTrace

SGen – Finalization and Weak References

SGen – The Major Collectors

SGen

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Android干货

浅谈EditText控件的inputType类型

1183
来自专栏石奈子的Java之路

原 荐 JVM笔记整理

2223
来自专栏帘卷西风的专栏

S_OK,S_FALSE,E_FAIL

今天在调试一个ICOP的操作的时候,发现连接被动关闭的时候老是会在一处断言处失败,跟了很久终于发现了问题。在此记录一下:

921
来自专栏NetCore

Fluent NHibernate RC 1.0 --升级内容

Fluent NHiberante(FNT) RC 1.0 已经在上个星期发布了,其中很多东西被废弃,有些方法改进,还有一些命名更贴切,虽说不是很完美,但已经做...

2115
来自专栏Golang语言社区

测试一下golang协程资源占有率

摘要: golang 协程 资源占有 GO版本:go version go1.4.2 linux/amd64 测试环境: [root@localhost mpr...

3546
来自专栏信安之路

Dotnet 结构分析学习笔记

这两天一直在看 dotnet,重点是对 Dotnet 的结构进行学习,分析。之前有人问我要过博客地址,我的确搭过一个博客平台,将近有半年没有跟新了,就放在 VP...

2003
来自专栏牛肉圆粉不加葱

JVM GC 那些事(二)- 堆上的内存分配机制

前一篇文章JVM GC 那些事(一)- JVM 运行时内存划分介绍了 JVM 运行时的内存划分情况。本文将介绍 JVM GC “主战场” 堆上的内存分配机制。

631
来自专栏本立2道生

Win32对话框程序(2)

接着Win32对话框程序(1)来写 ,解决遗留的问题,即理解函数及其调用关系。文章中有些地方是自己的推断,因此肯定有叙述不准确甚至错误的地方,请指正,感谢~ 

2043
来自专栏Golang语言社区

测试一下golang协程资源占有率

摘要: golang 协程 资源占有 GO版本:go version go1.4.2 linux/amd64 测试环境: [root@localhost mpr...

3877
来自专栏Java成神之路

Java企业微信开发_05_消息推送之被动回复消息

微信加解密包 下载地址:http://qydev.weixin.qq.com/java.zip      ,此包中封装好了AES加解密方法,直接调用方法即可。

3362

扫码关注云+社区

领取腾讯云代金券