C#编译器参数导致内存泄漏。GenerateInMemory=true

C#编译器参数导致内存泄漏。GenerateInMemory=true,c#,memory-leaks,C#,Memory Leaks,我的问题是: 内存中的编译结果不会被VM GC appdomain将不卸载程序集 如果不首先运行完整的垃圾收集,就无法证明内存泄漏。即使如此,您也需要执行完整的垃圾收集,等待挂起的终结器,然后执行第二次完整的垃圾收集,以真正获取所有内容。(GC.Collect();GC.WaitForPendingFinalizers();GC.Collect())当我执行第二次完整GC时。内存大小将从21M下降到18M,这是否意味着完全GC已经完成了这项工作?在我的项目中,调用编译函数的频率很高。所以不应在静

我的问题是:

  • 内存中的编译结果不会被VM GC
  • appdomain将不卸载程序集

  • 如果不首先运行完整的垃圾收集,就无法证明内存泄漏。即使如此,您也需要执行完整的垃圾收集,等待挂起的终结器,然后执行第二次完整的垃圾收集,以真正获取所有内容。(
    GC.Collect();GC.WaitForPendingFinalizers();GC.Collect()
    )当我执行第二次完整GC时。内存大小将从21M下降到18M,这是否意味着完全GC已经完成了这项工作?在我的项目中,调用编译函数的频率很高。所以不应在静态函数中执行编译作业。
    static void compile()
    {
        CodeNamespace cn = new CodeNamespace("System.IO.TextReader");
        CodeCompileUnit ccu = new CodeCompileUnit();
        ccu.Namespaces.Add(cn);
    
        CSharpCodeProvider icc = new CSharpCodeProvider(); 
        CompilerParameters cplist = new CompilerParameters();
        cplist.GenerateExecutable = false;
        cplist.GenerateInMemory = false;  //★ memory is high when true
    
        cplist.ReferencedAssemblies.Add("System.dll");
        cplist.ReferencedAssemblies.Add("System.XML.dll");
        cplist.ReferencedAssemblies.Add("System.Web.Services.dll");
        cplist.ReferencedAssemblies.Add("System.Data.dll");
        CompilerResults cr = icc.CompileAssemblyFromDom(cplist, ccu);
    
    }
    static void Main(string[] args)
    {
    
        Process proc = Process.GetCurrentProcess();
        for (int i = 0; i < 300; i++)
        {
            compile();
        }
        long usedMemory = proc.PrivateMemorySize64;
        Console.WriteLine(usedMemory);  //print the memory size
    }
    
    GenerateInMemory      Memory Size (byte)
     true                   21688320 
     false                  16424960