可能重复:
如何在C#中获取或使用内存
我想在我的应用程序的状态栏中可视化我的应用程序使用的内存.我正在寻找记忆漏洞 - 但我不知道在哪里.现在,我的想法是在状态栏中可视化使用的内存,以便在我使用应用程序时找到它,找到问题发生的部分,然后我可以对其进行分析.
有人可以给我一些帮助,我怎样才能得到用过的记忆.
我一直在弄清楚我是如何获得进程的ram用法的.(它目前消耗多少ram,而不是预留多少,或者最大或最小)
假设我有一个在后台运行的进程,Java.exe,允许使用1024mb的ram,我怎么能知道它当前使用了多少ram.
我自己开始这个过程,所以我可以访问Process对象,我想更清楚一下我的属性是什么.
我有一个应用程序,在运行时,需要轮询自己的内存使用情况.如果它可以列出实例化的每个对象的内存使用情况,那将是理想的.我知道这可以通过WMI实现,但我希望有一些不依赖于WMI的东西.
有没有办法以编程方式准确地确定c#中对象使用的内存量?我不关心这个过程有多慢,所以左右运行GC是可以接受的(当然我更喜欢更高效的东西).
序列化对象并查看结果长度似乎不太准确(在这个方法的简单测试中,我看到一个整数返回值为54).
使用GC.GetTotalMemory(true)
似乎产生不一致的值,更不用说它们看起来太大了.
使用Marshal.SizeOf(object)
产生准确的结果,但似乎只适用于基元.
如果这些行中没有任何内容可用,则可以选择根据所使用的结构和所涉及的原语来计算大小.这也是可以接受的(虽然令人不安),但我需要知道计算对象开销等的正确方法.任何能够向我展示这种方法的文献都会很棒.
类似的SO问题(其中没有一个似乎具有准确计算对象大小的具体方法):
配置内存的工具(非程序化方法):
http://www.microsoft.com/en-us/download/details.aspx?id=16273
编辑:赏金已过期,但如果社区想将其奖励给某人,那么我选择 Raful Chizkiyahu。
我的一个 C# Winforms 程序中存在内存泄漏,我想绘制其内存使用情况随时间变化的图表,以便更好地了解可能导致泄漏的原因。问题是,没有一个常用的内存诊断命令与任务管理器声称的该进程消耗的内存相匹配。我认为这可能是由于使用不安全/非托管代码的应用程序未包含在总数中。
因此,为了尝试深入研究,我创建了一个新的 Winforms 应用程序,非常简单,只有一个计时器来实时报告内存使用情况。我用5个标签,各家有各家的功能(主要是发现从这里开始): ,Environment.WorkingSet
,,和。GC.GetTotalMemory(false)
GC.GetTotalMemory(true)
Process.GetCurrentProcess().PrivateMemorySize64
Process.GetCurrentProcess().WorkingSet64
令人惊讶的是(或者可能不是这样,叹气),我仍然无法让这五个数字中的任何一个与 Windows 10 任务管理器相匹配。这是一个屏幕截图:
所以我基本上要寻找的是 5.1MB 的数字。我如何偷偷地从 .NET 框架中提取那个隐藏的数字?
这是我在 Timer 滴答函数中的代码:
private void timer1_Tick(object sender, EventArgs e)
{
//Refresh();
label1.Text = "Environment.WorkingSet: " + Environment.WorkingSet ;
label2.Text = "GC.GetTotalMemory(false): " + GC.GetTotalMemory(false) ;
label3.Text = "GC.GetTotalMemory(true): " + GC.GetTotalMemory(true) ;
Process proc = Process.GetCurrentProcess();
label4.Text = "proc.PrivateMemorySize64: " + proc.PrivateMemorySize64 ;
label5.Text = "proc.WorkingSet64: " + proc.WorkingSet64 ;
proc.Dispose();
} …
Run Code Online (Sandbox Code Playgroud) 我的后台任务需要很长时间才能完成,操作系统正在扼杀它.我正在尝试在线同步我的联系人,这是我正在做的事情:
从电话簿获取所有联系人(需要约1秒)
将它们上传到服务器(约2秒)
从服务器检索所有联系人(~2-3秒)
从ContactStore中删除所有联系人(ContactStore.DeleteAsync有时需要1分钟才能完成)
创建一个ContactStore并导入所有联系人)(1000个联系人约1-2分钟)
我有~100个联系人并且它运行良好,但我想测试~1000个联系人,并且每次都没有完成.我正在使用MaintenanceTrigger,但我认为它对于后台任务来说仍然太多了,但我需要对此进行确认.应该允许MaintenanceTrigger任务执行更多资源密集型任务,那么为什么操作系统会终止我的后台任务呢?
我试图创建以下数组
int numOfArrays = 50000;
int lengthOfArrays = 13500;
long[,] unsortedNumbers = new long[numOfArrays,lengthOfArrays];
Run Code Online (Sandbox Code Playgroud)
但我不断得出一个记忆异常.我瞄准x64,我相信我设置了大地址感知标志,看到图片,但我仍然得到错误.奇怪的是,我在同一个程序中有一个列表,消耗16gig的ram而没有任何问题.
系统:
64gig ram
高清100g免费.
c# ×9
memory ×3
memory-leaks ×2
.net ×1
.net-core ×1
64-bit ×1
asp.net ×1
asp.net-core ×1
c#-4.0 ×1
profiling ×1
runtime ×1
taskmanager ×1
winforms ×1