我在测试中发现,多次调用以下代码会造成内存泄漏:
object obj = Activator.CreateInstance(Type.GetType(arg2.DeclaringType.FullName));
arg2.Invoke(obj, new object[] { arg3 });
对于上述代码,arg2
为MethodInfo
类型; arg3
为string[]
即使我在Invoke之后添加obj = null;
,似乎GAC也没有收集此对象进行清理。 (是的,我知道将对象设置为null是dispose()的一个不好的借口,但是因为这是一个通用方法,所以类中可能有或没有dispose(),并且使用已经处理的程序集进行测试,它们在使用后没有卸载)
我考虑使用一种缓存机制,其中加载的程序集存储在字典中以供后续查找,但是无法保证GAC不会在以后清理它并使字典中的该对象无法使用(以及其他灾害)。
一旦我完成它,我如何强制卸载类(类似于我可以通过调用Activate
强制加载它的方式)?
答案 0 :(得分:1)
(如果你想知道原因:check this blog)
然而,对于一个不同的类,你在谈论从内存中释放它。首先,你确定没有其他对象可以访问它吗?
当你确定这一点时,知道垃圾收集器会随时释放未引用对象的内存,所以谈论内存泄漏可能有点早熟......
但你可以force the Garbage Collector to clean up the memory by calling GC.Collect()