近来在写一个简单的邮件发送工具,在进行压力测试的时候发现其内存一直在涨,涨的时间和大小每次都不一样,平均每半个小时涨4K。经分析,可能是发生了内存泄露,于是就整理了出来其最简单的模型来测试,如下:
using System; using System.Collections.Generic; using System.Text; using System.Threading; namespace MyTest { class Program { static void Main(string[] args) { Class1 c1 = new Class1(); while (true) { c1.Method1(); Thread.Sleep(200); } } public class Class1 { public Class2 Method1() { Class2 c2 = new Class2(); return c2; } } public class Class2 { } } }
该段代码有同样的问题。我发现如果将Class2的类型修改为Struct,则内存的使用一直是稳定的,于是假设是在方法Method1中创建的变量没有在堆中及时清理,而程序是每隔200毫秒循环一次,从而导致内存使用一直再涨。但如果Class2是Struct类型的,则在结束方法体Method1后,所创建的变量都会出栈的,这和代码的表现是一致的。于是在c1.Method1()之后添加了GC强制清理垃圾的语句(所有的文章都不推荐这样,这里仅仅是为了测试),结果内存没有出现了增长的情况,难道真的是因为堆没有及时清理从而导致的问题么?该问题有什么好的解决方案,请高人指教!