.NET アプリのメモリ リークを追跡しようとしています。Windows タスク マネージャーはメモリ使用量が一定のままであると報告しますが、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: Windows7
興味深いことに、「データ」を次元の 2D ギザギザ配列にすると[1000 * 1000 * 100][1]
、タスク マネージャーはメモリ使用量の増加を報告します。