C # Windows CE .net 3.5 для проверки использования памяти - PullRequest
5 голосов
/ 04 августа 2011

Я новичок в этом месте и начинаю с C # mobile. Сейчас я работаю на платформе C # для портативных устройств. Итак, у меня есть вопрос, как получить использование памяти. Я попытался GC.GetTotalMemory () и получить выделенную память, которую использовал GC. Но могу ли я использовать это, чтобы оценить, сколько моего приложения было выделено памяти. Я полагаю, что это может быть, но не совсем правильно. Затем я попробую Google найти любую ссылку, класс или что-либо, что можно использовать для проверки памяти в Windows CE, но я нашел только в другой платформе, которая не поддерживается с тем, что я делаю.

Спасибо заранее, Stoper


Прошу прощения за то, что я ушел с этого поста.

Я действительно благодарю всех, кто ответил на мой вопрос и посмотрел этот пост.

Теперь я получил все, что мне нужно, реализовав ссылку "OpenNetCF" в моем проекте.

Еще раз спасибо;)

Ответы [ 2 ]

6 голосов
/ 04 августа 2011

Согласно документам, GC.GetTotalMemory возвращает

Число, которое является наилучшим доступным приближением количества байтов, выделенных в настоящий момент в управляемой памяти.

Это немного вводит в заблуждение / сбивает с толку некоторых разработчиков, особенно тех, кто приезжает из родного мира.Он скажет вам, сколько памяти выделил GC для внутреннего использования , но не то, каково его фактическое выделение для всей кучи (т.е. выделенной и нераспределенной управляемой памяти) из системы.*

Он также не сообщает о собственных распределениях.Это может быть огромным, если вы используете много объектов GDI (растровые изображения, кисти и т. Д.), Поскольку они также имеют собственное распределение памяти.В случае растрового изображения, его управляемый объем на самом деле намного меньше, чем его собственный размер.

Если вас интересует фактическое влияние управляемых приложений на общие системные ресурсы, вам нужно запросить ОС и спроситьсколько физической и виртуальной памяти ему нужно, чтобы получить реальное представление о том, что происходит (я считаю, что GC.GetTotalMemory на самом деле относительно бесполезен).P / Invoking GlobalMemoryStatus дает вам то, что вы хотите.MSDN содержит пример .

3 голосов
/ 21 августа 2011

Попробуй это. Это даст вам то, что я думаю, что вы хотите, в том числе то, что вы имели с 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");
    /*************************************************************************/
}
...