/.NET

2011-07-04 4 views
5

가능한 중복 : Memory Leak in C#/.NET


Is it possible to have a memory leak in managed code? (specifically C# 3.0)
가이 어제에 비슷한 질문했지만, 자바에 대한, 그래서 관심 있어요 - C#/.NET에서 메모리 누수를 만드는 데 필요한 것은 무엇입니까 (안전하지 않은 사용하지 않고)?

+1

이 글의 답변 중 일부는, 정치적인 실제 예를 들어 여기 참조; 이것은 나를 위해 충분 "내 애플 끔찍한 죽음을"아이모 인식 누출 충분히 만족하고, /smartbear.com/support/articles/aqtime/net-allocation-profiler/ "분명히이 핸들러는 주어진 이벤트에서 제거되지 않으므로 누출이 발생합니다." –

답변

12

정적 이벤트; 그들이 결코 범위를 벗어나지 않기 때문에, 드디어.

static event EventHandler Evil; 

for(int i = 0 ; i < 1000000 ; i++) 
    Evil += delegate {}; 

익명 방법

는 단순히 멋진 - 투 -이 여기에 있지만, 이 돼지는 변수/필드에 복사본을하지 않는 취소 및 것을 를 구독 할 수 있기 때문에 좋은입니다.

기술적으로 여전히 Evil.GetInvocationList()를 통해 액세스 할 수 있습니다으로이 실제로 "유출"되지 않는다 - 일반 객체와 함께 사용할 때이 예기치 않은 개체의 수명을 일으킬 수, 즉

MyHeavyObject obj = ... 
... 
SomeType.SomeStaticEvent += obj.SomeMethod; 

이제 객체 obj에 영원히 산다. HTTP :/P

+0

인데도 여전히 그걸 얻을 수있다 ... 아니야? –

+1

예, 이전에이 문제를 고쳐야했습니다. 다시 한번 그런 일이 없기 때문에 정확히 한 번만 ... = –

+0

@Adam Ralph : 모든 구독자는 (이벤트 등록을 취소하지 않는 한) 무한정 보관됩니다. 이벤트가 정적입니다. –

5

개체가 이벤트를 구독 할 때 이벤트를 노출하는 개체는 구독자에 대한 참조를 유지합니다 (실제로는 MultiCastDelegate은 원래 수행하지만 전달됩니다). 이 참조는 에 의해 유지 관리되는 참조 번호가 아닌 해당 참조 번호가 범위를 벗어나면 가입자이 GC되고 있지 않도록합니다.

다른 두 개의 대답은이 상황을 완전히 뒤로 가지며 올바르지 않습니다. 이것은 간단한 예제로 보여 드리기에 조금 까다 롭다. 대개 더 큰 프로젝트에서 볼 수 있지만, 가입자에 대한 참조는 MultiCastDelegate (event)에 의해 유지되며이를 통해 생각할 수 있어야합니다.

편집 : 마크는 자신의 반응에 언급로서 당신은 기술적으로 GetInvocationList() 방법을 통해 "유출"개체에 대한 참조를 얻을 수 있지만, 코드는 그것을 사용하게 될 가능성이 있고 당신이 OutOfMemoryExcetion와 충돌 할 때 문제가되지 않습니다 .

+0

매우 사실이며 전적으로 동의합니다. 그러나 이것이 질문에 대답하지 않는다는 것을 명심해야합니다. –

+0

@Adam Ralph : 그렇지 않습니까? 그것은 메모리를 누설하는 한 가지 방법을 설명합니다. 어떻게 그 질문에 답하는 것을 피합니까? –

+0

메모리 누수에 대해 설명하는 것에 동의하지 않습니다.메모리 누수는 루핑되지 않은 객체가 사용하는 모든 메모리를 비우지 않으므로 GC가 깨졌습니다. 상황에서 참조 및 수명이 올바르게 유지되고 있으며 GC가 필요한 모든 개체를 유지하고 있다고 설명합니다. –

1

직접 메모리 액세스는 안전한 관리 코드에서 추상화됩니다. 코드를 작성하거나 메모리 누수 버그가있는 제 3 자 리소스 (FCL 내에있을 수도 있음)에서 메모리의 누출을 유발하려면 안전하지 않은 코드를 호출해야합니다.