簡體   English   中英

C#Windows CE .net 3.5檢查內存使用情況

[英]C# Windows CE .net 3.5 to checked the memory usage

我是這個地方的新手,也是C#mobile的首發。 現在,我正在研究C#手持設備平台。 所以,我有一些問題要詢問如何獲取內存使用情況。 我嘗試了GC.GetTotalMemory()並獲取GC使用的已分配內存。 但是,我可以使用它來估計我的應用程序分配了多少內存。 我想這可能不是實際的正確。 然后我嘗試谷歌搜索任何參考或類或任何用於檢查Windows CE內存的東西,但我發現只在另一個平台不支持我正在做的事情。

先謝謝,Stoper


為此我道歉,我離開了這篇文章。

我非常感謝任何回答我的問題並留意這篇文章的人。

現在,通過在我的項目中實現“OpenNetCF”引用,我獲得了所需的一切。

再次感謝 ;)

根據文檔, GC.GetTotalMemory返回

一個數字,是當前在托管內存中分配的字節數的最佳可用近似值。

這對某些開發者來說有點誤導/混淆,特別是那些來自本土世界的開發者。 它會告訴你GC在內部分配了多少內存,但沒有告訴你它從系統中分配給整個堆(即分配和未分配的托管內存)的實際內容。

它也不報告本機分配。 如果您使用大量GDI對象(位圖,畫筆等),那么這可能是巨大的,因為它們也具有本機內存分配。 在Bitmap的情況下,它的托管占用空間實際上比其原生占用空間小得多。

如果您對托管應用程序對整個系統資源的實際影響感興趣,您需要查詢操作系統並詢問它有多少物理和虛擬內存才能真正感受到正在發生的事情(我發現GC.GetTotalMemory是事實上相對無用)。 P /調用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");
    /*************************************************************************/
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM