C# Windows CE .net 3.5 для проверки использования памяти
Я новичок в этом месте и начинаю с C# mobile. Сейчас я работаю на платформе C# для портативных устройств. Итак, у меня есть вопрос, как получить использование памяти. Я попытался GC.GetTotalMemory() и получить выделенную память, которую использовал GC. Но могу ли я использовать это, чтобы оценить, сколько моего приложения было выделено памяти. Я полагаю, что это может быть, но не совсем правильно. Затем я попробую Google найти любую ссылку, класс или что-либо, что можно использовать для проверки памяти в Windows CE, но я обнаружил только в другой платформе, которая не поддерживает то, что я делаю.
Заранее спасибо, Стопер
Извиняюсь за то, что я ушёл с этого поста.
Я действительно благодарю всех, кто ответил на мой вопрос и посмотрел этот пост.
Теперь я получил все, что мне нужно, внедрив ссылку "OpenNetCF" в моем проекте.
Еще раз спасибо;)
2 ответа
Согласно документам, GC.GetTotalMemory
возвращается
Число, которое является наилучшим доступным приближением количества байтов, выделенных в данный момент в управляемой памяти.
Это немного вводит в заблуждение / сбивает с толку некоторых разработчиков, особенно тех, кто приезжает из родного мира. Он расскажет вам, сколько памяти выделил GC внутри, а не каково его фактическое выделение для всей кучи (то есть выделенной и нераспределенной управляемой памяти) из системы.
Он также не сообщает о собственных распределениях. Это может быть огромным, если вы используете много объектов GDI (растровые изображения, кисти и т. Д.), Поскольку у них также есть собственное распределение памяти. В случае растрового изображения, его управляемый объем на самом деле намного меньше, чем его собственный размер.
Если вас интересует фактическое влияние управляемых приложений на общие системные ресурсы, вам нужно запросить у ОС и спросить, сколько у нее физической и виртуальной памяти, чтобы получить реальное представление о том, что происходит (я считаю, что GC.GetTotalMemory относительно бесполезный на самом деле). P / Invoking GlobalMemoryStatus дает вам то, что вы хотите. MSDN содержит пример.
Попробуй это. Это даст вам то, что я думаю, что вы хотите, в том числе то, что вы имели с GC.GetTotalMemory(). Вам придется заменить текстовые ярлыки на свои собственные или использовать их по своему усмотрению. Вы должны будете использовать P/Invoke, хотя...
public struct MEMORYSTATUS
{
public UInt32 dwLength;
public UInt32 dwMemoryLoad;
public UInt32 dwTotalPhys;
public UInt32 dwAvailPhys;
public UInt32 dwTotalPageFile;
public UInt32 dwAvailPageFile;
public UInt32 dwTotalVirtual;
public UInt32 dwAvailVirtual;
}
[DllImport("coredll.dll")]
private static extern void GlobalMemoryStatus(out MEMORYSTATUS lpBuffer);
public static void GetGlobalMemoryStatus(out UInt32 dwTotal, out UInt32 dwAvail,
out UInt32 dwProcTotal, out UInt32 dwProcAvail)
{
MEMORYSTATUS status = new MEMORYSTATUS();
output.Length = (UInt32)System.Runtime.InteropServices.Marshal.SizeOf(output);
GlobalMemoryStatus(out status);
dwTotal = status.dwTotalPhys;
dwAvail = status.dwAvailPhys;
dwProcTotal = status.dwTotalVirtual;
dwProcAvail = status.dwAvailVirtual;
}
private void UpdateMemoryDisplay()
{
/*************************************************************************/
bool IsTotalGB = false;
bool IsUsedGB = false;
uint TotalRamMemory;
uint AvailRamMemory;
uint ProcTotalRamMemory;
uint ProcAvailRamMemory;
GetGlobalMemoryStatus(out TotalRamMemory, out AvailRamMemory,
out ProcTotalRamMemory, out ProcAvailRamMemory);
float TotalMB = (float)((float)TotalRamMemory / (1024 * 1024));
float UsedMB = TotalMB - (float)((float)AvailRamMemory / (1024 * 1024));
int RamPercent = (int)((UsedMB / TotalMB) * 100.0);
if (1000 < TotalMB)
{
TotalMB /= 1000;
IsTotalGB = true;
}
if (1000 < UsedMB)
{
UsedMB /= 1000;
IsUsedGB = true;
}
this.RamMemMinLbl.Text = UsedMB.ToString("0.0") + ((false != IsUsedGB) ? "GB" : "MB");
this.RamMemMaxLbl.Text = TotalMB.ToString("0.0") + ((false != IsTotalGB) ? "GB" : "MB");
this.RamMemPercent.Current = RamPercent;
IsUsedGB = false;
TotalMB = (float)((float)ProcTotalRamMemory / (1024 * 1024));
UsedMB = TotalMB - (float)((float)ProcAvailRamMemory / (1024 * 1024));
if (1000 < UsedMB)
{
UsedMB /= 1000;
IsUsedGB = true;
}
this.ProcRamMemMinLbl.Text = UsedMB.ToString("0.0") + ((false != IsUsedGB) ? "GB" : "MB");
IsUsedGB = false;
UsedMB = (float)((float)GC.GetTotalMemory(false) / (1024 * 1024));
if (1000 < UsedMB)
{
UsedMB /= 1000;
IsUsedGB = true;
}
this.GCMemMinLbl.Text = UsedMB.ToString("0.0") + ((false != IsUsedGB) ? "GB" : "MB");
/*************************************************************************/
}