2016-08-19 54 views
0

我注意到在测试中,即以下面的代码多个呼叫创建了一个内存泄漏:如何使用反射装载后释放装配体?

object obj = Activator.CreateInstance(Type.GetType(arg2.DeclaringType.FullName)); 
arg2.Invoke(obj, new object[] { arg3 }); 

对于上述码,arg2MethodInfo类型; arg3string[]

即使我在调用后添加obj = null;,似乎GAC不会收集此对象进行清理。 (是的,我知道将一个对象设置为null是dispose()的一个糟糕借口,但是由于这是一个通用方法,因此类中可能会有或可能不存在dispose(),并且会使用具有dispose ,它们不会在使用后卸载)

我已经考虑使用缓存机制,其中加载的程序集存储在字典中以供后续查找,但是不能保证GAC不会在稍后进行清理词典中的对象不可用(在其他灾难中)。

一旦我完成它,我该如何强制卸载该类(类似于我可以通过调用Activate来加载它的方式)?

+1

您是否想要释放AppDomain中的程序集或处理对象的实例?你是标题和文字有误导性 – Mark

+1

对于局部变量,'obj = null'通常是毫无意义的。 JIT和GC协作来“理解”引用的生命周期,并且只要没有其他代码要从'obj'读*,它就不再保存它所引用的对象。没有你的帮助是必需的。 –

+0

@Damien_The_Unbeliever - 我应该澄清一下我的测试。我打开了用户界面,并做了多次调用上述代码(点击事件)的操作。每点击一次,内存使用量增加。我能够将它从缓存的36MB缓存到100MB,并在几次点击后使用。点击所做的唯一操作是加载此程序集,反映该方法并退出。 –

回答

1

我们来看看这个,you can not unload an assembly when it has been loaded unless you unload the entire Application Domain

(如果你想知道为什么:check this blog

然而,一类是不同的,你说的是从内存中释放出来。首先,你确定没有其他对象有权访问它吗?然而

当你已经知道,知道,垃圾收集器会释放每当就是了未被引用的对象的内存,所以在谈论内存泄漏可能会有点prematured ...

您可以force the Garbage Collector to clean up the memory by calling GC.Collect()

+0

我会尝试强制执行GC,但正如您所说,我可能必须等到应用程序决定不再使用它进行清理 - 或者只是缓存该类,因为它似乎是无论如何,无论如何都会阻止它被加载多次。 –