문제

습니다.NET 원근법:

  • 은 무엇인 메모리 누수?
  • 얼마나 있는지 여부를 확인할 수 있습니다 당신의 응용 프로그램 누출?영향은 무엇인가?
  • 어떻게 예방할 수 있는 메모리 누수가?
  • 하는 경우 응용 프로그램에는 메모리 누수,그것은 멀리 프로세스가 종료되거나 사망?또는 메모리 누수 응용 프로그램에서 다른 프로세스에 영향을 미치는 시스템에서 후에도 프로세스가 끝?
  • 그리고 무엇에 대해 관리되지 않는 코드를 통해 액세스 COM Interop 및/또는 P/Invoke?
도움이 되었습니까?

해결책

최 설명은 본은 7 장에서의 무료 프로그래밍의 기초 e-book.

기본적으로, .NET 메모리 누수가 발생하면 참조체를 뿌리고,따라서할 수 없는 쓰레기 수집됩니다.이 발생하수할 때에 개최하는 참조를 넘어도 범위가 있습니다.

당신이 알고있는 당신이 누출을 시작할 때 얻 OutOfMemoryExceptions 또는 당신의 메모리 사용량이가 넘어 당신이 무엇을 기대하는 것(성능 모 는 메모리 카운터).

이해 .NET메모리 모델은 가장 좋은 방법이다.특히,이해하는 방법을 쓰레기 수집가 작동하는 방법과를 참조 작업을 다시,당신을 참조하 제 7 장의 e-book 입니다.또한,주의 일반적인 위험,아마도 가장 일반적인되는 이벤트입니다.는 경우에는 개체 A 은 이벤트에 등록된 개체에 대 B, 다음체 A 는 것체 B 이 사라지기 때문에 B 을 보유하고 참조 A.이 솔루션은 등록을 취소하려면 이벤트를 할 때 당신은 끝났어.

물론,좋은 메모리를 프로필에는 당신이 당신의 개체 그래프와 탐구를 중첩/를 참조하의 개시를 참조에서 오는 무엇 루트 개체 책임(레드 게이트 개미 프로파일,Jetbrains 의 dotMemory, memprofiler 은 정말 좋은 선택,또는 당신이 사용할 수 있는 텍스트만 WinDbgSOS, 하지만 나는 강하게 추천 상업/visual 제품 하지 않으면 당신은 실제 전문가).

내가 믿는 관리되지 않는 코드는 주제는 그것의 일반적인 메모리 누수를 제외하고,공유 참조하여 관리되는 쓰레기 수집기.내가 잘못 될 수 있습니다.이것에 대해 마지막 지점입니다.

다른 팁

엄격히 말하면,메모리 누수가 메모리는"더 이상 사용하지 않으로"프로그램입니다.

"더 이상 사용하지 않"는 하나 이상의 의미를 의미할 수 있었다"더 이상 그것을 참조하",즉,완전히 복구할 수 없는 또 그것을 의미할 수 있었,참조,복구할 수 있는 사용되지 않지만 프로그램을 유지 참조 anyway.만 나중에 적용됩니다.순위 완벽하게 관리되는 개체.그러나,모든 클래스는 완벽하고 어떤 시점에서 근본적인 관리되지 않 구현수 리소스를 영구적으로 하는 과정입니다.

모든 경우에,응용 프로그램 것보다 많은 메모리를 사용은 엄격히 필요합니다.측면을 효과에 따라 금액 유출,갈 수 없음에서,둔화에 의해 발생하는 과도한 컬렉션의 일련의 메모리 예외하고 마지막으로 치명적인 오류에 의해 따라 강제 프로세스가 종료됩니다.

당신이 알고 있는 응용 프로그램은 메모리 문제를 모니터링 할 때 보여주는 더 많은 메모리를 할당해 귀하의 프로세스 후 각 가비지 컬렉션 주기.이러한 경우에,당신은 어느 유지 너무 많은 메모리에서,또는 기본관리의 구현사가 포함될 수 있습니다.

대부분을 위해 누출,리소스가 복구 프로세스가 종료되는,그러나 몇 가지 자원은 항상 복구에서 몇 가지 정확한 경우,GDI 에 커서를 처리하는 악명이 높다.물론 있는 경우 프로세스 간의 통신기구,할당된 메모리에서 다른 프로세스가지가 해제될 때까지는 과정이 해제 또는 종료됩니다.

나는 생각한다"무엇을 메모리 누수가"및"어떤 효과"질문에 응답되었습을 잘 이미만을 추가하는 몇 가지 다른 질문을...

는 방법을 이해하는지 여부를 누수 응용 프로그램

한 가지 흥미로운 방법을 오픈 성능 모 추가에 대한 추적을 #바이트 모두에서는 힙#Gen2 컬렉션 에서,각 경우에만 놓고 보면의 과정입니다.운동을 하면 특정 기능의 원인 총 바이트 수를 증가하고는 계속 메모리를 할당한 후에 다음 Gen2 컬렉션,당신이 말할 수 있는 기능을 메모리 누수가 발생한다.

을 방지하는 방법

다른 좋은 의견이 있습니다.나는 그가 아마도 가장 일반적으로 간과 의 원인.NET 메모리 누수가 추가하는 이벤트를 처리기의 개체없이 제거 할 수 있습니다.이벤트 처리기에 부착하는 개체의 양식을 참조하여 해당 개체는 것을 방지 컬렉션은 후에도 모든 다른 참가 갔다.항상 기억하는 분리 이벤트를 처리기(사용 -= syntax C#).

은 누출 가을 멀리 할 때는 프로세스가 종료되는 시기,그리고 무엇 COM?

면 프로세스가 종료되는,모든 메모리 매핑된 그것의 주소 공간에서 회수되는 OS 를 포함하여 모든 COM 체에서 제공 DLLs.비교적 거의,COM 체에서 제공될 수 있는 별도의 프로세스입니다.이 경우 귀하의 프로세스가 종료된 후,당신은 여전히 수 있습에 대한 책임 메모리에 할당된 모든 COM 서버 프로세스는 당신이 사용됩니다.

하는 메모리 누수 개체로되지 않을 확보한 모든 메모리를 할당한 후에 그것은 완료했습니다.내가 찾은 이것은 일어날 수 있는 응용 프로그램에서 사용하는 경우에는 Windows API COM(i.e관리는 코드에서 버그가 있거나 올바르게 관리되고 있지 않은지),에 프레임워크 및에서 세 번째 파티를 구성 요소입니다.또는지 보 후 사용하여 특정 개체에 다음과 같 펜을 일으킬 수 있습니다.

나 개인적으로 고통의 메모리 예외가 될 수 있는 발생지는 배타적이지 메모리 누수 도 있습니다.(OOM 에서 올 수 있습 고정 참조 핀 기사).을 받고 있지 않은 경우 OOM 오류 또는지 확인하고 필요한 경우 그것은 메모리 누수가 그것이 원인이 되는 유일한 방법은 프로필 응용 프로그램입니다.

또한 것을 시도하고 다음 사항을 확인합니다:

는)모든 것을 구현하는 Idisposable 는 처리 중 하나를 사용하여 마지막으로 차단하거나 이를 사용하여 문이 이러한 브러시,펜 등등.(일부 사람들은 모든 것을 설정하에서 아무것도 추가)

b)아무것도 가까운 방법은 다시 닫을 사용하여 마지막으로 또는 사용 진술서(지만 내가 찾는 사용하지 않는 항상 가까이 따라 선언한 경우 외부 개체를 사용하여 문)

c)사용하는 경우에는 관리되지 않는 코드/windows API 는 이러한 처리가 올바르게 한 후.(일부가 정하는 방법 리소스를 해제)

이게 도움이 되었으면 좋겠습니다.

필요할 경우를 진단하는 메모리 누수합니다.NET 확인,이러한 링크:

http://msdn.microsoft.com/en-us/magazine/cc163833.aspx

http://msdn.microsoft.com/en-us/magazine/cc164138.aspx

그 기사를 만드는 방법에 대해 설명합니다의 메모리 덤프 프로세스 및 분석하는 방법을 먼저 결정하는 경우 누수가 관리되지 않거나 관리하며,그것은,관리하는 방법을 파악합니다.

Microsoft 또한 최신을 지원하는 도구로 생성 덤프를 대체 하이라는 DebugDiag.

http://www.microsoft.com/downloads/details.aspx?FamilyID=28bd5941-c458-46f1-b24d-f60151d875a3&displaylang=en

CLR 프로파일러를 사용하여 Microsoft 에서 http://www.microsoft.com/downloads/details.aspx?familyid=86ce6052-d7f4-4aeb-9b7a-94635beebdda&displaylang=en 는 좋은 방법을 결정하는 개체는 들고 메모리를,무엇을 실행 흐름을 이끈 이러한 객체의 생성하고,또한 모니터링하는 개체는 어디에 힙(조각,LOH,etc.).

최 설명하는 방법을 쓰레기 수집가는 작품에서 제프 Richters CLR 를 통해 C# 예약,(Ch.20).를 읽고 이렇게 좋은 지상에 놓는 방법을 이해하는 개체를 유지됩니다.

하나의 가장 일반적인 원인이 되는 응원의 개체수가 연결하여 이벤트 외습니다.연결 하는 경우는 외부 이벤트

예:

SomeExternalClass.Changed += new EventHandler(HandleIt);

하고 잊을 분리하면 그것을 처음 SomeExternalClass ref 당신의 클래스입니다.

위에서 언급한 바와 같이, 사이테크 디스 메모리를 프로파일 우수에서 보여주는 당신의 뿌리를 개체는 의심되는 것이다.

하지만 또한 아주 빠른 방법을 확인하는 특정 유형은 단지 사용 WnDBG(도 사용할 수 있습니다 이에 VS.NET 즉각적인 창는 동안에 부착):

.loadby sos mscorwks
!dumpheap -stat -type <TypeName>

지금은 뭔가를 당신이 생각하는 것이기를 폐기 개체의 유형(예를 들어,창을 닫으).그것의 편리한 여기에는 디버깅 버튼이 어딘가에는 것이 실행 System.GC.Collect() 몇 번입니다.

실행 !dumpheap -stat -type <TypeName> 다시합니다.는 경우 번호를 가지 않았다,또는 가지 않았다 아래로 예상대로,다음 기준에 대한 추가적인 검사를 받게 됩니다.(이 끝에서 세미나에 의해 주어 Ingo 대).

내 생각에서 관리되는 환경,누설 될 것이 당신을 유지하고 불필요한 참조하의 큰 덩어리 메모리 주변에 있다.

왜 사람들이 생각하는 메모리 누수합니다.NET 되지 않은 다른 것과 같은 새는가?

메모리 누수가 연결할 때 자원을 가하지 않습니다.이렇게 할 수 있습에서 모두 관리되고 관리되지 않는 코딩이다.

에 관한.순,그리고 다른 프로그래밍 도구,가 있었 아이디어에 대한 쓰레기를 수집하고는 다른 방법을 최소화하는 상황을 만들 것입니다 당신의 응용 프로그램 누수가 발생합니다.하지만 가장 좋은 방법을 방지하는 메모리 누수가 이해해야하는 당신의 기본 메모리 모델,그리고 어떻게 작동 플랫폼에서,당신이 사용하고 있습니다.

는 믿음 GC 과 다른 것입니다 마법은 정은 짧은 방법을 메모리 누수,을 찾기 어려울 것입니다.

코딩할 때는 관리되지 않는,당신은 일반적으로는지 확인하는 청소,당신이 알고 있는 자원을 잡는 것이 귀하의 책임을 정하지 않는 수위.

습니다.NET 반면에,많은 사람들이 생각하는 GC 이 정리됩니다 모든 것입니다.만,그것은 당신을 위해,그러나 당신이 필요가 있는지 확인하는 중입니다..NET 랩 많은 것들,그래서 당신은 항상 알고 있는 경우 다루고 관리하거나 관리하지 않 자원,그리고 당신은 필요한 것을 확인하고 당신이 무엇을 다루고 있습니다.글꼴을 처리 하는 자원 활동 디렉터,데이터베이스 등을 일반적으로 일할 필요가 있습니다.

에서 관리되는 용어이 내 앞에 이르렀으니 내가 내 목에 라인을 말한 그것은 멀리 갈단 프로세스가 죽/제거됩니다.

나는 많은 사람들이지만,그리고 나는 정말 이 종료됩니다.요청할 수도 없습니다 사용자가 앱을 종료하는 청소!을 살펴 브라우저할 수 있는 IE,FF 등,다음을 열고,말,구글 리더 그것을 보자,숙박을 위해 몇 일에서 보면 무엇이 발생합니다.

는 경우 다음을 열고 다른 탭 브라우저에서 서핑,어떤 사이트로,다음 탭을 닫을 호스팅하는 다른 페이지로 만든 브라우저 누출,당신은 당신이 생각하는 브라우저에 출시 메모리?그렇지 않습니다.내 컴퓨터에 즉 쉽게 먹는 1Gb 의 메모리에서 짧은 시간(3~4 일)를 사용하는 경우 Google 리더입니다.일부 newspages 는 더 악화됩니다.

내 생각에서 관리되는 환경 누설 될 것이 당신을 유지 불필요한 참조하여 큰 덩어리 의 메모리다.

물론입니다.또한,사용하지 않는다.폐기()메소드에서 처분할 수 있는 개체의 적절한 경우에 발생할 수 있습 mem 수적입니다.은 그것을 할 수있는 가장 쉬운 방법이 사용하여 차단기 때문에 그것은 자동으로 실행됩니다.폐기()끝:

StreamReader sr;
using(sr = new StreamReader("somefile.txt"))
{
    //do some stuff
}

과를 만드는 경우는 클래스를 사용하여 관리되지 않는 객체을 구현하지 않는 경우 IDisposable 올바르게 일으키는 원인이 될 수 있는 메모리 누수 클래스 사용자에게 달려 있습니다.

모든 메모리 누수가에 의해 해결되 프로그램을 종료됩니다.

누수가 충분한 메모리고 운영 체제 결정할 수 있습니다 문제를 해결합니다.

나는 것에 동의가 버나드로이다.net 무엇 mem 누출이 될 것입니다.

수 프로필 응용 프로그램을 메모리 사용,결합하는 경우 그 관리를 많이 기억하지 않아야 될 것을 말할 수 있었다고 있습니다.

에서 관리되는 용어이 내 앞에 이르렀으니 내가 내 목에 선을 말한 그것은 멀리 갈 프로세스가 죽/제거됩니다.

는 관리되지 않는 코드는 자신의 짐승하고 누출이 존재하면 안됩니다,그것을 따라 표준 mem.누출을 정의합니다.

또한 명심하십시오.그물에는 두 개의 힙,하나되는 큰 객체를 힙.내가 믿는 개체의 약 85k 또는 더 큰 이 힙.이 힙는 다른 평생 규정보다는 정기적인 힙.

을 만드는 경우에는 대형 메모리 구조(사전 또는 목록의)그것은 신중하 이동 조회는 무슨 정확한 규칙이 있다.

로 메모리를 회수하에 프로세스 종료하지 않는 한,당신의 실행 Win98 또는 그 등가물,모든 것이 다시 출시하 OS 에 종료됩니다.유일한 예외는 것이 열리는 크로스 프로세스와 다른 프로세스는 여전히 자원 열려 있습니다.

COM 체 까다로운 일이 될 수 있습니다.는 경우에 당신은 항상 사용 IDispose 패턴,당신은 안전합니다.그러나 걸쳐 실행했는 몇 interop 어셈블리를 구현하는 IDispose.여기의 열쇠를 통화 Marshal.ReleaseCOMObject 당신이 완료되면니다.COM 체 여전히 사용하는 표준 COM 참조한다.

내가 발견 .Net 메모리를 프로파일 매우 좋은 도움을 찾을 때에 메모리 누수.Net.료와 같은 Microsoft CLR 프로파일러,하지만 빠르고 더 많은 지점에서 제 생각입니다.A

하나의 정의는: 리미 도달할 수 없는 메모리할 수 있는 더 이상 할당을 새로운 프로세스를 실행하는 동안에 할당하는 과정입니다.수은 대부분 치료를 사용하여 GC 또는 기술 감지하여 자동화된 도구입니다.

에 대한 상세 정보를 참조하시기 바랍니 http://all-about-java-and-weblogic-server.blogspot.in/2014/01/what-is-memory-leak-in-java.html.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top