.NET App에서 메모리 누수를 추적하려고합니다. Windows 작업 관리자는 메모리 사용량이 지속적으로보고하는 반면 Process Explorer은 메모리 사용량이 증가한다고보고합니다. 작업 관리자에서 작업 관리자가 Process Explorer와 일치하지 않습니까?
, 나는 전용 메모리 칼럼, "메모리 (개인 작업 집합)"에서 찾고 있어요. Process Explorer에서 "Private bytes"열을 찾고 있는데, 그 이유는 "Working set"아래의 값이 올라 가기 때문입니다.몇 가지 할당 후에 내 응용 프로그램이 메모리 부족 ( 예외)으로 인해 프로세스 탐색기가 적합합니다. 문제는 왜 작업 관리자 앱의 메모리 사용을 잘못보고 않습니다입니까? 뿐만 아니라 글로벌 시스템의 여유 메모리를 잘못보고합니다 (성능 탭의 그래프는 일정하게 유지됩니다).
내 코드가 필요하지 않을해야하지만, 여기가 완전성을위한 것입니다. 큰 배열을 포함하는 빈 창을 보여줍니다. 아무 키나 누르면 창이 닫히고 새 배열이 열리고 새 창이 열립니다. 이전 창은 qt4dotnet GUI 라이브러리의 버그로 인해 누출되었습니다.
using System;
using com.trolltech.qt.gui;
namespace LeakTest
{
class Test : QWidget
{
public byte[] Data = new byte[1000 * 1000 * 100];
public Test()
{
show();
GC.Collect(); // so measurements are more accurate
}
protected override void keyPressEvent(QKeyEvent arg__1)
{
disposeLater();
new Test();
}
[STAThread]
static void Main(string[] args)
{
QApplication.initialize(args);
new Test();
QApplication.exec();
}
}
}
OS : 윈도우 7
재미있는 참고 : 나는 "데이터"차원 [1000 * 1000 * 100][1]
의 2D 가변 배열, 작업 관리자 을 할 때 않는 메모리 사용량을 제기 보고서.
.NET 메모리 누수를 찾기 위해 작업 관리자/프로세스 탐색기를 사용하는 것에 강하게 반대 할 것입니다.Ususally, 나는 [ANTS Memory Profiler] (http://www.red-gate.com/products/dotnet-development/ants-memory-profiler/)를 사용하고 심지어 그러한 특수한 도구로도 누설을 찾기가 어렵다. . 방금 작업 관리자를 사용했다면 나는 과거에 누수를 발견 할 기회가 없었을 것입니다. –
아직 사용 된 적이없는 페이지는 첫 번째 액세스시에만 0으로 지정할 수 있기 때문에 백킹이 필요하지 않습니다. 따라서 그들은 개인용 바이트로 간주하지만 RAM이 필요없고 작업 세트의 일부가 아닙니다. – CodesInChaos
@CodeInChaos : 아, 그게 많이 설명됩니다. –