我是这个地方的新手,也是C#mobile的首发。现在,我正在研究C#手持设备平台。所以,我有一些问题要询问如何获取内存使用情况。 我已尝试 GC.GetTotalMemory()并获取GC使用的已分配内存。但是,我可以使用它来估计我的应用程序分配了多少内存。我想这可能不是实际的正确。然后我尝试谷歌搜索任何参考或类或任何用于检查Windows CE内存的东西,但我发现只在另一个平台不支持我正在做的事情。
提前致谢, Stoper
道歉,因为我离开了这篇文章。
我真的感谢任何回答我的问题并留意这篇文章的人。
现在,通过在我的项目中实现“OpenNetCF”参考,我获得了所需的一切。
再次感谢;)
答案 0 :(得分:6)
根据文档,GC.GetTotalMemory
返回
一个数字,是当前在托管内存中分配的字节数的最佳可用近似值。
这对某些开发者来说有点误导/混淆,尤其是那些来自本土世界的开发者。它将告诉您GC已在内部内部分配了多少内存但不是它对系统的整个堆(即分配的和未分配的托管内存)的实际分配是多少。
它也不会报告本机分配。如果您使用大量GDI对象(位图,画笔等),那么这可能是巨大的,因为它们也具有本机内存分配。在Bitmap的情况下,它的托管占用空间实际上比其原生占地面积小得多。
如果您对托管应用程序对整体系统资源的实际影响感兴趣,则需要查询操作系统并询问它有多少物理和虚拟内存,以便真正感受到什么是继续(我发现GC.GetTotalMemory实际上相对无用)。 P / Invoking GlobalMemoryStatus为您提供所需内容。 MSDN包含an example。
答案 1 :(得分: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");
/*************************************************************************/
}