六狼论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博账号登陆

只需一步,快速开始

搜索
查看: 57|回复: 0

mono的gc问题

[复制链接]

升级  66.67%

42

主题

42

主题

42

主题

秀才

Rank: 2

积分
150
 楼主| 发表于 2013-1-19 04:12:46 | 显示全部楼层 |阅读模式
mono的gc一直 使用 conservative gc..可见其文档的描述。是一种较为落后的实现,没有分代。在最近的2.8版本中多了
一种sgen的新gc..据称性能不错..原来的gc一直有precise stack scanning的问题。在一些stack上分配的对象存在无法收集的可能性。
 
前天看到一文:
http://flyingfrogblog.blogspot.com/2010/07/mono-24-still-leaking-like-sieve.html
 
需要凸墙...
 
作者用了一个简单的代码来证实这种memory leak的存在。我用c#改写了,代码如下:
 
public class MainS
    {
        public static void Main(string[] args)
        {
            for(var i = 0; i!=30; ++i)
            {
                var t = new Dictionary<int,int>();               
                for(var j = 0; j!=10000000; ++j)
                {
                   
                    t[j] = j;
                }
                Console.WriteLine(string.Format("{0},{1}",t.Count,i));
                //GC.Collect();
            }
            Console.WriteLine("haha");
        }
    }
 
此段代码在 mono 默认的gc上无法执行,会报outofmemory的错误..在新的sgen gc上勉强可以运行一阵子,但是最终会报sgen内部的一些错误。如果想要正确运行。那么可以把注释的部分打开 。。或者加入t.Clear()。这样在sgen gc下可以正常运行。在原有的gc依然不行。。
 
此段代码在注释掉gc.collect下在ms .net 3.5, .net 4.0均可以正常运行。现在看来mono的gc虽然有进步但是还不尽人意。。
 
出于好奇,我在python也实现了同样的代码,也没有任何问题。
 
据roadmap称,mono 2.10在gc方面将会有比较大的改进,希望如此。
 
测试环境: ubuntu10.04 32 bit, mono 2.8.2
                    windows 7 64 bit, .net 4.0, .net 3.5
 
有趣的是,如果把i 和 j的值 互换并不会出现问题。。看起来似乎mono的gc对 stack的大量对象存在回收的问题...
您需要登录后才可以回帖 登录 | 立即注册 新浪微博账号登陆

本版积分规则

快速回复 返回顶部 返回列表