2011-09-04 57 views
3

我正在尝试跨AppDomain对象,并发现了一件很奇怪的事情。简单交叉应用程序对象中的内存泄漏

当我调用一个远程方法,它分配一个MemoryStream对象并返回它的引用(并立即由调用者处理),内存使用情况相当显着地增加并且不会下降,即使在调用GC.Collect ()。

在每次返回新的String或byte []对象的调用方法中,都没有泄漏。

Memory Profiler显示大多数活动对象的类型是Char []和String(在MemoryStream的情况下)。

问题是 - 我误解了什么,远程调用并不像继承MarshalByRefObject那么简单?

+0

发表一些代码。您不能在AppDomains之间传递引用。 –

+0

@亨克,那么远程引用的正确术语是什么(当你透明传递[ObjRef](http://msdn.microsoft.com/en-us/library/system.runtime.remoting.objref.aspx )横跨边界的实例)? – Lucero

+0

@亨克,我称它为“参考”,因为它是MarshalByRefObject - 当然我知道没有涉及“真实”的参考。远程方法的代码非常简单:'Stream GetStream(){return new MemoryStream(Encoding.ASCII.GetBytes(“Somestring”));}',我把它称为(在另一个AppDomain中),比如'remote.GetStream() .Dispose()' – aldem

回答

3

远程调用非常简单 - 但对象生命周期和垃圾回收并不那么简单。

您应该阅读一下leases and sponsorships

+0

是否意味着即使明确处置的对象也不会立即收集(或很快)?我在我的代码中为LifeTimeServices设置了一些设置,但这并没有什么帮助。 – aldem

+0

好的,我发现为什么设置不起作用 - 它们必须在主机域中进行更改,所以现在一切都按需要收集。感谢提示:) – aldem

+0

虽然,现在,我想知道 - 是否有任何简单的方法显式标记对象为未使用?就像在我的例子中 - 当我读取远程流时,我可以处理它,以便它可以更快地收集,而忽略默认值。 – aldem