2011-09-04 54 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