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已经完成了这项工作?在我的项目中,调用编译函数的频率很高。所以不应在静
如果不首先运行完整的垃圾收集,就无法证明内存泄漏。即使如此,您也需要执行完整的垃圾收集,等待挂起的终结器,然后执行第二次完整的垃圾收集,以真正获取所有内容。(
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