众所周知,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还没出动,所以我把代码改一下,在 B.dcA.Clear(); 收加上 GC.Collect();
可是,这行代码居然一点作用都没有。
...............................