0

.NET 메모리 관리가 대형 개체 힙을 만드는 이유는 무엇입니까? 그것의 대부분은 비어있는 것 같습니다. 이것에 대해 염려해야 할 것이 있습니까?대형 오브젝트 힙이 대부분 비어있는 이유는 무엇입니까?

실제로 응용 프로그램에서 179MB 상당의 큰 개체 만 있다는 것을 의미합니까? 1714 MB는 1171428792 (Heap0 LOH)에서 983396616 (무료 LOH)을 빼서 도착합니다.

아래 정보는 w3wp.exe 즉 ASP.NET 프로세스에서 생성 된 덤프 파일에서 WinDbg를 사용하여 수집되었습니다. 프로세스는 Windows 2008 64 비트 운영 체제에서 호스팅됩니다. 응용 프로그램은 "무료"라는 개체의 총 바이트 값 봐 -stat! DumpHeap을 실행 3.

0:025> !HeapStat 
Heap    Gen0   Gen1   Gen2   LOH 
Heap0   4628496  3840808 319586376 1171428792 

Free space:             Percentage 
Heap0    24   24  1926224 983396616SOH: 0% LOH: 83% 

답변

0

내가 제안 마이크로 소프트 .NET 프레임 워크 4.0 및 ASP.NET MVC를 사용하여 구축된다. 이것들은 사용 가능한 LOH에서 무료 블록이 될 것이지만 Large Object Heap을 스 래싱하여 조각화되었습니다. 이 숫자가 가까워지면 짧은 수명을 가진 많은 오브젝트로 LOH를 치고 여유 메모리 조각을 남겨 둡니다 (이 힙은 절대로 압축되지 않습니다).

0

LOH가 커밋 되었습니까? 아니면 예약 된 주소 공간입니까?

여기서는 Sysinternal의 VM Map을 사용하여 PowerShell.exe 인스턴스를 살펴 보았습니다. 총 GC 힙 크기는 ~ 390MB이지만 두 개의 가장 큰 블록 (~ 240MB 및 ~ 125MB)은 예약되어 있습니다. 20MB 미만이 확약됩니다 (즉, 실제 메모리 또는 페이지 파일 공간이 할당 됨).

이 작업을 다시 시행하려면 총 프로세스 커밋이 ~ 200MB이며 GC 힙에 할당 된 주소 공간보다 적습니다.

+0

이 데이터를 덤프 파일에서 가져올 수 있습니까? –

+0

@Dhwanil 가능. 전체 대 미니 덤프에 의존 할 수 있으며 아마도 덤프 파일에서 VS가 아닌 WinDbg를 사용해야 할 것입니다. 실행시에 VM Map을 사용하는 것이 더 쉽습니다 :-) – Richard

관련 문제