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");
    /*************************************************************************/
}
Другие вопросы по тегам