C#如何报告非特定内存使用情况
因此,我试图向我的上司证明该产品存在内存泄漏。但是,运行接触COM对象的脚本大约需要2小时才能复制到C#如何报告非特定内存使用情况,c#,.net,memory,memory-leaks,C#,.net,Memory,Memory Leaks,因此,我试图向我的上司证明该产品存在内存泄漏。但是,运行接触COM对象的脚本大约需要2小时才能复制到OutOfMemoryException。为了使这一点能够表现出来,我需要一个基线的数据来显示并不是我的脚本本身导致了内存问题,也需要数据来显示该行为确实复制了内存泄漏 我计划通过将总内存使用量的定期报告写入日志文件来实现这一点。例如,在此框中,我的Windows任务管理器->性能选项卡显示我当前使用的是2.00GB中的1.67GB。这是我需要在代码中提取的数字,并定期转储到日志文件中 只有一个问
OutOfMemoryException
。为了使这一点能够表现出来,我需要一个基线的数据来显示并不是我的脚本本身导致了内存问题,也需要数据来显示该行为确实复制了内存泄漏
我计划通过将总内存使用量的定期报告写入日志文件来实现这一点。例如,在此框中,我的Windows任务管理器->性能选项卡显示我当前使用的是2.00GB中的1.67GB。这是我需要在代码中提取的数字,并定期转储到日志文件中
只有一个问题。。。我怎样才能得到那条信息
谢谢你能提供的任何帮助,即使是告诉我这是不可能的
更新:感谢您提供有关COM内存问题的信息,但我所说的“基线”也以完全相同的方式触及COM对象,不会像特定行为那样导致内存问题。在这里,只有我提出的问题的答案对我有帮助。更新:在回答OP的问题时,class
System.GC
有一种估算内存使用量的方法:
System.GC.GetTotalMemory(false)
如果在长时间运行的进程(即没有空闲时间)上使用COM,则除非定期调用:
Thread.CurrentThread.Join(100);
当然,100
可以更改,但将是活动线程在恢复之前“休眠”的时间。从文档中:
阻止调用线程,直到线程终止或指定的时间过去,同时继续执行标准COM和SendMessage泵送
最后一条才是关键
参考:
如果基于单线程单元(STA)的控制台应用程序创建并使用STA组件对象模型(COM)组件,并且控制台应用程序没有执行足够的操作来传输COM消息,例如调用Monitor.Enter方法、Thread.Join方法等,则可能会出现以下症状。此外,如果console应用程序执行长时间运行且不发送消息的操作,例如调用console.ReadLine方法,则可能会出现以下症状:
- COM组件的发布可能会延迟
- 对垃圾收集器收集的对象的Finalize方法的调用可能会延迟
- 对COM组件的调用可能会长时间阻止应用程序线程。 STA应用程序进程使用的内存量可能会随着时间的推移而增加。
- 对GC.WaitForPendingFinalizers方法的调用可能需要很长时间才能返回
更新:,在回答OP的问题时,class
System.GC
有一种方法可以获得所用内存量的估计值:
System.GC.GetTotalMemory(false)
如果在长时间运行的进程(即没有空闲时间)上使用COM,则除非定期调用:
Thread.CurrentThread.Join(100);
当然,100
可以更改,但将是活动线程在恢复之前“休眠”的时间。从文档中:
阻止调用线程,直到线程终止或指定的时间过去,同时继续执行标准COM和SendMessage泵送
最后一条才是关键
参考:
如果基于单线程单元(STA)的控制台应用程序创建并使用STA组件对象模型(COM)组件,并且控制台应用程序没有执行足够的操作来传输COM消息,例如调用Monitor.Enter方法、Thread.Join方法等,则可能会出现以下症状。此外,如果console应用程序执行长时间运行且不发送消息的操作,例如调用console.ReadLine方法,则可能会出现以下症状:
- COM组件的发布可能会延迟
- 对垃圾收集器收集的对象的Finalize方法的调用可能会延迟
- 对COM组件的调用可能会长时间阻止应用程序线程。 STA应用程序进程使用的内存量可能会随着时间的推移而增加。
- 对GC.WaitForPendingFinalizers方法的调用可能需要很长时间才能返回
你有这方面的参考资料吗?为什么仅仅使用COM会导致内存泄漏?@0xA3,我在一个windows服务上遇到了这个错误,我编写该服务是为了使用WatiN(它使用IE作为COM组件)执行一项长期运行的任务。直到我在迭代之间添加了这条线,泄漏才消失。COM组件需要能够“泵送事件”,否则它们无法自行清理。这就像没有GC一样。我看看是否能找到指引我正确方向的链接。@0xA3,啊,在那里。编辑答案,包括。非常感谢,柯克!这是非常有用的信息,我不知道。@0xA3,是的,也完全出乎我的意料。这只是为了表明,当你走出CLR时,外面是一片荒野你有这方面的参考资料吗?为什么仅仅使用COM会导致内存泄漏?@0xA3,我在一个windows服务上遇到了这个错误,我编写该服务是为了使用WatiN(它使用IE作为COM组件)执行一项长期运行的任务。直到我在迭代之间添加了这条线,泄漏才消失。COM组件需要能够“泵送事件”,否则它们无法自行清理。这就像没有GC一样。我看看是否能找到指引我正确方向的链接。@0xA3,啊,在那里。编辑答案,包括。非常感谢,柯克!这是非常有用的信息,我不知道。@0xA3,是的