En utilisant le code que j'ai trouvé here, voici un exemple de code de solution de Charles Bailey:
public class MemoryAnalyzer {
public long GetLargestFreeRegionSize() {
// getting minimum & maximum address
SYSTEM_INFO sysInfo;
GetSystemInfo(out sysInfo);
var procMinAddress = sysInfo.minimumApplicationAddress;
var procMaxAddress = sysInfo.maximumApplicationAddress;
// saving the values as long ints so I won't have to do a lot of casts later
var procMinAddressL = (long)procMinAddress;
var procMaxAddressL = (long)procMaxAddress;
// current process
var process = Process.GetCurrentProcess();
// opening the process with desired access level
var processHandle = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_WM_READ, false, process.Id);
long maxFreeRegionSize = 0;
while (procMinAddressL < procMaxAddressL) {
const int memBasicInfoSize = 28; //sizeof(MEMORY_BASIC_INFORMATION)
MEMORY_BASIC_INFORMATION memBasicInfo;
VirtualQueryEx(processHandle, procMinAddress, out memBasicInfo, memBasicInfoSize);
if (memBasicInfo.State == MEM_FREE) {
maxFreeRegionSize = Math.Max(maxFreeRegionSize, memBasicInfo.RegionSize);
}
// move to the next memory chunk
procMinAddressL += memBasicInfo.RegionSize;
procMinAddress = new IntPtr(procMinAddressL);
}
return maxFreeRegionSize;
}
#region Win32
// REQUIRED CONSTS
const int PROCESS_QUERY_INFORMATION = 0x0400;
const int PROCESS_WM_READ = 0x0010;
const int MEM_FREE = 0x10000;
// REQUIRED METHODS
[DllImport("kernel32.dll")]
public static extern IntPtr OpenProcess(int dwDesiredAccess, bool bInheritHandle, int dwProcessId);
[DllImport("kernel32.dll")]
public static extern bool ReadProcessMemory(int hProcess, int lpBaseAddress, byte[] lpBuffer, int dwSize, ref int lpNumberOfBytesRead);
[DllImport("kernel32.dll")]
static extern void GetSystemInfo(out SYSTEM_INFO lpSystemInfo);
[DllImport("kernel32.dll", SetLastError = true)]
static extern int VirtualQueryEx(IntPtr hProcess, IntPtr lpAddress, out MEMORY_BASIC_INFORMATION lpBuffer, uint dwLength);
// REQUIRED STRUCTS
public struct MEMORY_BASIC_INFORMATION {
public int BaseAddress;
public int AllocationBase;
public int AllocationProtect;
public int RegionSize;
public int State;
public int Protect;
public int lType;
}
public struct SYSTEM_INFO {
public ushort processorArchitecture;
ushort reserved;
public uint pageSize;
public IntPtr minimumApplicationAddress;
public IntPtr maximumApplicationAddress;
public IntPtr activeProcessorMask;
public uint numberOfProcessors;
public uint processorType;
public uint allocationGranularity;
public ushort processorLevel;
public ushort processorRevision;
}
#endregion
}
Ce sont là quelques bons indicateurs, mais les pires délinquants sont en réalité en dehors de .NET dans C DLLs que les fichiers de carte mémoire . Ces indicateurs supposent que le problème est visible sous forme de .NET, mais malheureusement ce n'est pas dans mon cas. – Sean
Si vous pouviez regarder les octets réservés par rapport aux octets validés, cela vous donnerait une meilleure idée. Je ne vois pas un compteur comme ça. MSN – MSN