由于所有变量均为托管对象,因此释放以前首先要释放强引用(任何直接声明的变量都算强引用)因此在BigData加入mi = null;这是.NET托管应用程序释放内存特有的方式,修改析构函数如下.
另外在主函数将bd对象交给托管堆(释放强引用)bd = null;清空队列arr.Clear();然后强制系统垃圾回收,可以施加内存压力,也可以直接调用GC.Collect()主函数如下:
然后调用主函数您一会定发现情况略微改善,应用程序在正确的时刻调用了析构函数。然而,内存的使用量并没有变化,换句话,mi对象交由系统托管后并没有从托管堆上被真正释放。 这是因为在主函数调用GC.Collect仅仅保证bd对象被释放,而bd对象内部包含的mi对象没有被释放,依然在托管堆上有系统认为合适的时候在释放,这个道理我几年都没有悟出来。因此您需要在BigData的析构函数中调用一次GC.Collect()修改后的BigData类如下
现在您再用任务管理器单步调试并查看内存可以发现在期望的时刻对象被释放并且内存被释放了。