这是传说中的.net内存泄露么

    技术2022-05-19  26

    近来在写一个简单的邮件发送工具,在进行压力测试的时候发现其内存一直在涨,涨的时间和大小每次都不一样,平均每半个小时涨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强制清理垃圾的语句(所有的文章都不推荐这样,这里仅仅是为了测试),结果内存没有出现了增长的情况,难道真的是因为堆没有及时清理从而导致的问题么?该问题有什么好的解决方案,请高人指教!


    最新回复(0)