根据string.Intern  可以看看string的内存是否释放
现在的问题就是,我有一个服务在运行,里面有while(true){string html = "";}
我分析内存,内存一直在增加,我希望可以释放掉string 申请的内存,请问如何做好些
环境mono linux(环境可忽略,有方法就可)

解决方案 »

  1.   

    试试手动GC
    GC.Collect();
      

  2.   

    补充一下,我用过gc,回收不了,大家觉得字符常驻内存的啊。。
    那什么。内存的增长是我面对的问题,如果gc那么简单实现了,我就不来发帖了
      

  3.   

    用托管堆管理内存,那内存的释放只能依靠GC来处理。如果想绕过GC,只有编写unsafe的代码,
    绕过托管堆,自己管理。
    希望快速释放内存,用 StringBuilder 比用String 要好
    还可以调用 GC.Collect() 通知GC强行释放内存。
      

  4.   

    在程序集上声明这个特性,不留用字符串。
    [assembly:CompilationRelaxationsAttribute(CompilationRelaxations.NoStringInterning)]
      

  5.   

    用完了string设为null,
    while(true){string html = "";......html=null;}
      

  6.   

    除了string html = "";......html=null;外,再
    每隔5秒钟再调用一次
    GC.Collect();
    GC.WaitForPendingFinalizers();可以使程序内存不变动很大
    至于马上回收string,目前还没找到解决方法。
      

  7.   

    string.Intern是用来从暂存池(intern pool)中检索出相同的字符串,intern pool是用来维持相同常量字符串唯一副本达到节约内存的目的,不是用来查看字符串内存是否释放。
    相反频繁调用string.Intern检索大量内容不同的字符串,则这些字符串都会被留存在intern pool中,而且到程序结束都不会释放,内存就会一直增加。
    http://msdn.microsoft.com/en-us/library/system.string.intern(v=vs.100).aspx
      

  8.   

    不一定就是String的问题,是你其它的代码造成的吧
    把String提出来再测试
    String str;
    while(true)
    {
        str="";
    }
      

  9.   

    如果你的string是静态字段的话,恐怕没有办法释放了吧,如果不是静态字段的话,GC对string会回收的,用不着手动回收,检查你的代码看看其它的问题吧
      

  10.   

    应该不是while(true){string html = "";}造成的内存一直增加的原因。
    内容相同的字符串会占用相同的固定内存地址。只是生成了好多个临时的指向常量字符串的好多html变量而已,而这些变量会自动删除的,在内存使用到一定的时候,GC会自动的释放,观察内存使用情况就可以发现,内存会稳定在一个范围,程序停止后会逐步的减小使用。
      

  11.   

    GC 会自动回收,要不就是 接受后,你给 string html = null;
      

  12.   

     不知道还有这东西  如果你字符串拼接的比较多的话   就用StringBuilder
      

  13.   

    请问下,用完后给string赋值为空,是不是把string指向另一个空值的内存地址。
    因为string是只读性的。
      

  14.   

    用完之后赋值null,赋值null是为了将变量不再指向实体,这时候并不能释放掉内存,当内存加载到一定程度的时候就会自动释放那些不再使用的对象,也就是之前没有赋控值时指向的实体所占有的内存就会被释放掉
      

  15.   

    String是字符串常量,它们的值在创建之后不能更改,存放于字符串常量池内存中,可以共享。
    如果你有大量的字符串拼接用StringBuffer,如果用String将会有很多String常量存放于内存中
      

  16.   

    while(true){string html = "";}你改成:
    string html = "";
    while(true)
    {
    html="xxx";
    }
    这样行不行?只有一个实例,用完就null.
    c#不熟悉,如果是c,c++可以这样。
      

  17.   

    同学们,windows下gc是会回收内存的,但是这是mono在linux下,   mono对gc支持还不是很好,所以我希望把很多不同的string 从暂存区给清除掉,也就是清除内存,应该如何做好一些呢
      

  18.   

    string这个特殊的数据类型有点模糊,是引用类型,却有值的特性,在多个string的时候还是使用StringBuidel的比较好,string 类型每一次赋值都会新分配空间,而以前的依然存在没有被回收,资源得不到立即释放,所以还是不要使用string的好。
      

  19.   

    string确实会存在不少问题,我就在上边吃过苦头特别如果写服务器程序慎用啊
      

  20.   

    Java代码:while(true){
       {
          String temp = "xxx";
       }
       byte a = 0;//同一个变量表中,不同作用域的slot会被重用,也就是说temp在一个作用域的第一个slot中,会被byte a覆盖掉
       gc();//会造成stop the world
    }不知道对于您是否有用???
      

  21.   

    当字符串的内容不断变化时,应使用StringBuider,使用string会产生大量的垃圾字符串
      

  22.   

    string html = string.Empty
      

  23.   

    string能耗多少内存,或者如果你真有那么大量的字符要处理,就改用StringBuider吧。
      

  24.   

    这个问题可以参考java的内存布局,其实GC 在系统调用的时候 是分级的,你可以把幸存者1 跟 2 全给用上,这样在挪动的时候 就会触发一次收集的过程,把无用的string清掉。
      

  25.   

    强烈建议阅读一下文章【一篇而已】:http://blog.csdn.net/icebox126/article/details/2286732
      

  26.   

    这是CLR的活吧,和环境无关。内存一直在增,是不是其他原因呢,重新检视下代码吧
      

  27.   

    给你的循环添加Thread.Sleep休息下,GC回收内存需要有这个CPU时间才行,一直运行你的循环就没空回收内存了。
      

  28.   

    GC 自动回收的 ,这是 托管代码的特点。你直接 string sssss = null;
    就可以了啊,这个就不会再内存开辟空间了。
      

  29.   

    string 不是什么特殊类型,也没有什么神秘的地方,和其他自然语言一样,它是基本数据类型,切记
      

  30.   

    为什么用 string html = ""
    .net里有定义好的空字符串 静态常量 string.Empty
    你用这个,无论你怎么循环,也不会浪费内存好吧、。、
    你的思路问题,即使没有string.Empty,你也可以自己定义一个空字符串常量嘛
      

  31.   

    我想说楼主你肯定你的程序是这样吗在你一直循环创建一个string s="";的时候,clr是会去判断的,如果之前字符串池里有你之前开辟的内存,那么久不会重新开辟了,所以你10000个s对象,内存地址都是指向0x1020320这样的内存地址的,不存在你的内存一直涨的情况再者GC释放内存可以理解为异步中的同步。。clr会为GC专门开启一个工作线程,暂停其他线程,然后进行回收,并且整理内存,压缩heep
      

  32.   

                StringBuilder sb = new StringBuilder();
                for (int i = 0; i < 1000; i++)
                {
                    sb.Append("ccccccdjsofijsoadfjasjfzjfiasuedjoiff");
                }
                while (true)
                {
                    string html = sb.ToString();
                }
    写了如上代码,在windows下,内存没有增长~
      

  33.   

    其实我不这个觉得,
    下面有两段代码:
     
    public void AAA()
    {
        while(true)
        {
            BBB("参数");
        }
    }
    public void BBB()
    {
        string html ="";
        //复杂的处理过程,开辟很多的对象;
    }------------------------------------------------------
    public void AAA()
    {
        while(true)
        {
            string html ="";
            //复杂的处理过程,开辟很多的对象;
        }
    }两个代码  看似一样,但是其实是有区别的!
    两个代码都是死循环,
    内存回收器,在执行完一个函数时:
        会释放栈内指类型,
        和部分明显的一代堆引用对象( 比如对象的引用,申明,使用 都只是在函数内且没有被其他引用,这种对象 是很容易被释放的);第二种代码的死循环,函数永不离开,开辟的对象(值类型,引用类型)都会不停的堆积。
    第一种代码的死循环,开辟的数据其实在离开 BBB 方法时,会被有效释放,是否释放完不得而知,但肯定释放得多!
      

  34.   

    可以试试将String设置为NULL
    其实这个可以不用考虑的,在运行结束后会自动回收的,使用GC也不是及时回收的