全局静态集合类型的变量的垃圾你给我去死!!!!_.NET_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > .NET > 全局静态集合类型的变量的垃圾你给我去死!!!!

全局静态集合类型的变量的垃圾你给我去死!!!!

 2013/8/11 16:07:15  银光小子  博客园  我要评论(0)
  • 摘要:问题众所周知,C#比起C++C等语言来说,最大的好处就是几乎不用管理内存,也就是不用处理‘垃圾’,会有GC自动来清扫。但我有一个疑惑就在于,全局静态集合型变量的垃圾谁来收?代码如上图,定义了一个哈希表dcA,初始给其填充1000万个对象A。执行该程序,会发现1000W个对象填充到内存里,内存会非常大,打开资源管理器会发现,这内存占了大约600M的样子。usingSystem;usingSystem.Collections.Generic;usingSystem.Linq
  • 标签:集合类 全局

问题

众所周知,C#比起C++ C 等语言来说,最大的好处就是几乎不用管理内存,也就是不用处理‘垃圾’,会有GC自动来清扫。但我有一个疑惑就在于,全局静态集合型变量的垃圾谁来收?

 

 

 

代码

如上图,定义了一个  哈希表dcA,初始给其填充   1000万个 对象A。执行该程序,会发现1000W个对象填充到内存里,内存会非常大,打开资源管理器会发现,这内存占了大约600M的样子。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    class Program
    {
        public static void Main(string[] args)
        {
            Run();

            Wait();
        }

        public static void Run()
        {
        
            for (int i = 0; i < 10000000; i++)
            {
                B.dcA.Add(i, new A());
            }

            B.dcA.Clear();

            Console.WriteLine("清除了");
        }

        public static void Wait()
        {
            Console.Read();
            Console.Read();
            Console.Read();
            Console.Read();
        }

    }

    class B
    {
        public static  Dictionary<int, A> dcA = new Dictionary<int, A>();
    }

    class A
    {
        public string str = "水水水水水水水水水水水水水水水水水水水水水水水水";
    }
}

 

可接下来让我蛋疼的问题是,清除掉了哈希表中的这1000W个对象。内存......  内存居然还是600多M,居然一点都没变。

 

 

 

内存检测工具来了


 

 

 

图中说的啥

第一图非常明显的告诉我,内存占用者就是那个明明已经为空的 键值对大哥。一下占了几百兆。
第二张图 告诉我,这个变量不是GC回收的对象,离 GC  root 还有一步之远。

 

 

 

所以,祭出GC了

尼玛内存一点都没减少,有种可能是GC还没出动,所以我把代码改一下,在  B.dcA.Clear(); 收加上  GC.Collect();
可是,这行代码居然一点作用都没有。


 

 

你说,全局静态集合类型的静态变量的垃圾谁来收呢??难倒一直在内存中呆着直到死???

...............................

 


 

 

发表评论
用户名: 匿名