5

我是这个地方的新手,并且是 C# 移动设备的初学者。现在,我在 C# 手持设备平台上工作。所以,我有一些问题要问如何获取内存使用情况。我尝试了 GC.GetTotalMemory()并获得了 GC 使用的分配内存。但是,我可以用它来估计我的应用程序分配了多少内存。我想这可能是正确的,但实际上并不正确。然后我尝试用谷歌搜索任何参考或类或任何用于检查 Windows CE 上的内存的东西,但我只在另一个不支持我正在做的事情的平台上找到。

在此先感谢,斯托珀


为我离开这篇文章道歉。

我真的很感谢任何回答我的问题并观看这篇文章的人。

现在,通过在我的项目中实现“OpenNetCF”引用,我得到了我需要的一切。

再次感谢 ;)

4

2 回答 2

6

根据文档,GC.GetTotalMemory返回

一个数字,它是托管内存中当前分配的字节数的最佳可用近似值。

这对一些开发者来说有点误导/混淆,尤其是那些来自原生世界的开发者。它将告诉您 GC 在内部分配了多少内存,但不会告诉您系统为整个堆(即已分配和未分配的托管内存)实际分配的内存是多少。

它也不报告本机分配。如果您使用大量 GDI 对象(位图、画笔等),这可能会很大,因为这些对象也具有本机内存分配。在位图的情况下,它的托管足迹实际上比它的本机足迹要小得多。

如果您对托管应用程序对整体系统资源的实际影响感兴趣,您需要查询操作系统并询问它需要多少物理和虚拟内存才能真正了解正在发生的事情(我发现 GC.GetTotalMemory 是实际上相对没用)。P/Invoking GlobalMemoryStatus给你你想要的。MSDN 包含一个示例

于 2011-08-04T05:09:12.383 回答
3

试试这个。它会给你我认为你想要的东西,包括你使用 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");
    /*************************************************************************/
}
于 2011-08-20T23:01:58.800 回答