C# Windows CE .net 3.5 за проверка на използването на паметта

Аз съм начинаещ на това място и започвам с C# mobile. Сега работя върху платформа за преносими устройства C#. И така, имам да задам един въпрос относно това как да получа използването на паметта. Опитах GC.GetTotalMemory() и получих разпределената памет, използвана от GC. Но мога ли да използвам това, за да преценя колко памет е разпределена за моето приложение. Предполагам, че може да е, но всъщност не е правилно. След това се опитах да потърся с Google всяка справка или клас или нещо, което да използвам за проверка на паметта на Windows CE, но намерих само в друга платформа, която не се поддържа от това, което правя.

Благодаря предварително, Стопър


Извинете, че се отдалечих от този пост.

Наистина съм ви благодарен на всеки, който отговори на въпроса ми и гледа тази публикация.

Сега получих всичко, от което се нуждая, като внедрих справката "OpenNetCF" в моя проект.

Благодаря отново ;)


person Sathapanic Sriprom    schedule 04.08.2011    source източник


Отговори (2)


Според документите GC.GetTotalMemory връща

Число, което е най-доброто налично приближение на броя байтове, разпределени в момента в управляваната памет.

Това е малко подвеждащо/объркващо за някои разработчици, особено тези, идващи от роден свят. Ще ви каже колко памет е разпределил GC вътрешно, но не и какво е действителното му разпределение за цялата купчина (т.е. разпределена и неразпределена управлявана памет) от системата.

Той също така не отчита естествените разпределения. Това може да бъде огромно, ако използвате много GDI обекти (растерни изображения, четки и т.н.), тъй като те също имат собствено разпределение на паметта. В случая на Bitmap, неговият управляван отпечатък всъщност е много по-малък от естествения му отпечатък.

Ако се интересувате от действителното въздействие на вашите управлявани приложения върху общите системни ресурси, трябва да направите запитване до операционната система и да попитате колко физическа и виртуална памет има, за да получите действително усещане за това, което се случва ( Намирам GC.GetTotalMemory за относително безполезен всъщност). P/Извикването на GlobalMemoryStatus ви дава това, което искате. MSDN съдържа пример.

person ctacke    schedule 04.08.2011
comment
За информация намерих GlobalMemoryStatus доста неточно на моето устройство с Windows CE 6. Наличните виртуални, налични физически стойности и стойностите за натоварване на паметта щяха да скочат, докато продължавах да зареждам повече изображения в паметта. Понякога стойностите биха били по-високи, отколкото преди изображението да бъде заредено, понякога по-ниски, въпреки че зареждах изображения (всички изображения бяха заредени). - person Trisped; 08.02.2013
comment
Съмнявам се, че е неточно - никога не съм виждал платформа къде е било. Вероятно просто не разбирате какво точно означава. GC държи своя собствена купчина, която може да расте или да се свива. За да го увеличите или свиете, той може да разпредели или освободи памет от операционната система. Тези разпределения могат да се грабват от физически или виртуални в зависимост от това дали са специално ангажирани страници или дали са чисто запазени. Разпределението на паметта не е супер просто и GC добавя още един слой сложност върху него. - person ctacke; 08.02.2013
comment
Ако искате, мога да ви дам дъмп на изхода. Не съм сигурен дали има нещо специално в операционната система, но имам цикъл, който зарежда изображения. Привидно произволно, общата налична физическа и виртуална памет ще скочи. Това трябва да е невъзможно, освен ако нещата не се преместват от паметта. - person Trisped; 10.02.2013
comment
GC вероятно освобождава манипулатори на HBITMAP, което от своя страна освобождава собствените блокове, където са били оригиналните растерни изображения, което освобождава физическа памет и потенциално виртуална памет в зависимост от местоположението и това, което е около него. - person ctacke; 10.02.2013
comment
? но все още мога да използвам изображенията и да ги показвам на екрана. Изображенията не се изхвърлят, те се поставят в масив като част от система за кеширане. - person Trisped; 12.02.2013

Опитайте тази. Ще ви даде това, което мисля, че искате, включително това, което сте имали с 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");
    /*************************************************************************/
}
person CCS    schedule 20.08.2011
comment
Благодаря за всички вас. Сега получих препратката към OpenNETCF. Това е всичко, което искам. Но все още намирам как да получа използването на паметта на приложението. - person Sathapanic Sriprom; 27.08.2011