C#Windows CE.net 3.5来检查内存使用情况

C#Windows CE.net 3.5来检查内存使用情况,c#,windows,.net-3.5,windows-ce,handheld,C#,Windows,.net 3.5,Windows Ce,Handheld,我是这里的新手,也是C#mobile的新手。现在,我正在C#手持设备平台上工作。所以,我有一些问题要问关于如何获得内存使用率。 我尝试了GC.GetTotalMemory()并获得了GC使用的分配内存。但是,我可以用它来估计我的应用程序分配了多少内存吗。我想这可能是正确的,但实际上并不正确。然后我尝试用谷歌搜索任何引用、类或任何东西来检查WindowsCE上的内存,但我只在另一个平台上找到了我正在做的事情不支持的东西 提前感谢,, 采场 很抱歉我离开了这个帖子 我真的很感谢所有回答我问题并关注

我是这里的新手,也是C#mobile的新手。现在,我正在C#手持设备平台上工作。所以,我有一些问题要问关于如何获得内存使用率。 我尝试了GC.GetTotalMemory()并获得了GC使用的分配内存。但是,我可以用它来估计我的应用程序分配了多少内存吗。我想这可能是正确的,但实际上并不正确。然后我尝试用谷歌搜索任何引用、类或任何东西来检查WindowsCE上的内存,但我只在另一个平台上找到了我正在做的事情不支持的东西

提前感谢,, 采场


很抱歉我离开了这个帖子

我真的很感谢所有回答我问题并关注这篇文章的人

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

再次感谢;)

根据文档,返回

当前在托管内存中分配的字节数的最佳可用近似值

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

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


如果你对你的托管应用程序对整个系统资源的实际影响感兴趣,你需要查询操作系统,并询问它有多少物理和虚拟内存才能真正感受到正在发生的事情(我发现GC.GetTotalMemory实际上是相对无用的)。P/调用为您提供所需的内容。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");
    /*************************************************************************/
}
公共结构内存状态
{
公共UInt32 DWL长度;
公共UInt32 dwMemoryLoad;
公共单位32个;
公共UInt32 dwAvailPhys;
公共UInt32 dwTotalPageFile;
公共UInt32 dwAvailPageFile;
公共UInt32虚拟;
公共UInt32数据可用虚拟;
}
[DllImport(“coredll.dll”)]
私有静态外部无效GlobalMemoryStatus(out MEMORYSTATUS lpBuffer);
公共静态无效GetGlobalMemoryStatus(out UInt32 DWTOTALL,out UInt32 dwAvail,
out UInt32 DWPROCOTALL,out UInt32 DWPROCAVAL)
{
MEMORYSTATUS status=新的MEMORYSTATUS();
output.Length=(UInt32)System.Runtime.InteropServices.Marshal.SizeOf(输出);
GlobalMemoryStatus(输出状态);
dwTotal=status.dwTotalPhys;
dwAvail=status.dwAvailPhys;
dwProcTotal=status.dwTotalVirtual;
dwProcAvail=status.dwAvailVirtual;
}
私有void UpdateMemoryDisplay()
{
/*************************************************************************/
bool-IsTotalGB=false;
bool IsUsedGB=false;
整体记忆;
uint可用内存;
uint程序总体记忆;
uint程序可用内存;
GetGlobalMemoryStatus(输出TotalMemory、输出AvailamMemory、,
out ProcTotalMemory,out ProcAvailramemory);
float TotalMB=(float)((float)totalramemory/(1024*1024));
float UsedMB=TotalMB-(float)((float)可用内存/(1024*1024));
int-RamPercent=(int)((UsedMB/TotalMB)*100.0);
如果(1000<总MB)
{
总mb/=1000;
IsTotalGB=真;
}
如果(1000<使用DMB)
{
UsedMB/=1000;
IsUsedGB=true;
}
this.rammeminbl.Text=UsedMB.ToString(“0.0”)+((false!=IsUsedGB)?“GB”:“MB”);
this.rammemaxlbl.Text=TotalMB.ToString(“0.0”)+((false!=IsTotalGB)?“GB”:“MB”);
this.rammpercent.Current=斜率;
IsUsedGB=false;
TotalMB=(float)((float)程序总体内存/(1024*1024));
UsedMB=TotalMB-(float)((float)procavailramemory/(1024*1024));
如果(1000<使用DMB)
{
UsedMB/=1000;
IsUsedGB=true;
}
this.procrammeminbl.Text=UsedMB.ToString(“0.0”)+((false!=IsUsedGB)?“GB”:“MB”);
IsUsedGB=false;
UsedMB=(float)((float)GC.GetTotalMemory(false)/(1024*1024));
如果(1000<使用DMB)
{
UsedMB/=1000;
IsUsedGB=true;
}
this.GCMemMinLbl.Text=UsedMB.ToString(“0.0”)+((false!=IsUsedGB)?“GB”:“MB”);
/*************************************************************************/
}

谢谢大家。现在,我得到了“OpenNETCF”参考。这就是我想要的。但我仍在寻找如何获取应用程序内存使用率。仅供参考,我发现在我的Windows CE 6设备上,
GlobalMemoryStatus
相当不准确。当我继续将更多图像加载到内存中时,可用的虚拟、可用的物理和内存加载值将跳跃。有时,这些值会比加载图像之前的值高,有时甚至更低,即使我正在加载图像(所有图像都保持加载)。我怀疑这不准确-我从未见过这样的平台。可能是你根本不明白它到底意味着什么。GC拥有自己的堆,堆可能会增长或收缩。为了增加或减少内存,它可以从操作系统中分配或释放内存。这些分配可能从物理或虚拟抓取,具体取决于它们是专门提交页面,还是纯粹保留页面。内存分配不是超简单的,GC在上面增加了另一层复杂性。如果你愿意,我可以给你一个输出转储。我不确定操作系统是否有什么特别之处,但我有一个lo