2011-09-04 6 views
3

크로스 AppDomain 객체를 실험하고 있는데 아주 이상한 점이 하나 있습니다.간단한 크로스 앱 객체에서의 메모리 누수

MemoryStream 개체를 할당하고 참조를 반환하는 원격 메서드를 호출하면 GC.Collect를 호출 한 후에도 메모리 사용이 상당히 증가하고 중단되지 않습니다().

매번 새로운 String 또는 byte [] 객체를 반환하는 호출 방법에서는 누수가 없습니다.

메모리 프로파일 러는 대부분의 활성 객체가 Char [] 및 String 유형 (MemoryStream의 경우)임을 보여줍니다.

질문은 - 나는 뭔가를 오해하고 원격 호출이 MarshalByRefObject에서 상속하는 것처럼 간단하지 않습니까?

+0

몇 가지 코드를 게시하십시오. AppDomains간에 참조를 전달할 수 없습니다. –

+0

@Henk, 원격 참조에 대한 정확한 용어는 무엇입니까? ([ObjRef]를 투명하게 전달할 때 얻을 수있는 용어입니다 (http://msdn.microsoft.com/en-us/library/system.runtime.remoting.objref.aspx) 인스턴스 간 경계)? – Lucero

+0

@Henk, 간단히 말해 MarshalByRefObject이기 때문에 "참조"라고 부릅니다. 물론 "실제"참조가 없다는 것을 알고 있습니다. 원격 메소드의 코드는 간단합니다.'Stream GetStream() {새로운 MemoryStream (Encoding.ASCII.GetBytes ("Somestring"));}'을 반환하고, 그것을 (다른 AppDomain에서)'remote.GetStream() .Dispose()' – aldem

답변

3

원격 호출은 쉽지만 개체 수명 및 가비지 수집은 간단하지 않습니다.

leases and sponsorships에서 조금 읽어야합니다.

+0

은 명시 적으로 배치 된 객체조차 즉시 수집되지 않는다는 것을 의미합니까? 내 코드에서 LifeTimeServices에 대한 몇 가지 설정을했지만 정말 도움이되지 않습니다. – aldem

+0

좋아요, 설정이 작동하지 않는 이유를 발견했습니다. 호스트 도메인에서 변경해야하므로 필요에 따라 모든 것이 수집됩니다. 힌트를 주셔서 감사합니다 :) – aldem

+0

, 지금, 나는 알고 싶습니다 - 명시 적으로 객체를 사용하지 않는 것으로 표시하는 간단한 방법이 있습니까? 내 예에서와 마찬가지로 - 원격 스트림을 읽을 때 처리 할 수 ​​있으므로 기본값을 무시하고 더 빨리 수집 할 수 있습니다. – aldem