如何在使用反射加载后释放程序集?
How I can free an assembly after loading it using reflection?
我在测试中注意到,多次调用以下代码会导致内存泄漏:
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() 的一个糟糕借口,但是由于这是一个通用方法,因此 class 中可能有也可能没有可用的 dispose() 并使用程序集进行了测试确实有处理,使用后不会卸载)
我考虑过使用缓存机制,将加载的程序集存储在字典中以供后续查找,但是不能保证 GAC 以后不会来清理它,使字典中的对象不可用(以及其他灾难)。
如何在完成后强制卸载 class(类似于我可以通过调用 Activate
强制加载它的方式)?
(如果您想知道原因:check this blog)
然而,对于class它是不同的,你说的是从内存中释放它。首先,您确定没有其他对象可以访问它吗?
当您确信这一点时,知道垃圾收集器会在需要时释放未引用对象的内存,因此谈论内存泄漏可能有点为时过早...
不过你可以force the Garbage Collector to clean up the memory by calling GC.Collect()
我在测试中注意到,多次调用以下代码会导致内存泄漏:
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() 的一个糟糕借口,但是由于这是一个通用方法,因此 class 中可能有也可能没有可用的 dispose() 并使用程序集进行了测试确实有处理,使用后不会卸载)
我考虑过使用缓存机制,将加载的程序集存储在字典中以供后续查找,但是不能保证 GAC 以后不会来清理它,使字典中的对象不可用(以及其他灾难)。
如何在完成后强制卸载 class(类似于我可以通过调用 Activate
强制加载它的方式)?
(如果您想知道原因:check this blog)
然而,对于class它是不同的,你说的是从内存中释放它。首先,您确定没有其他对象可以访问它吗?
当您确信这一点时,知道垃圾收集器会在需要时释放未引用对象的内存,因此谈论内存泄漏可能有点为时过早...
不过你可以force the Garbage Collector to clean up the memory by calling GC.Collect()