Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/262.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#如何报告非特定内存使用情况_C#_.net_Memory_Memory Leaks - Fatal编程技术网

C#如何报告非特定内存使用情况

C#如何报告非特定内存使用情况,c#,.net,memory,memory-leaks,C#,.net,Memory,Memory Leaks,因此,我试图向我的上司证明该产品存在内存泄漏。但是,运行接触COM对象的脚本大约需要2小时才能复制到OutOfMemoryException。为了使这一点能够表现出来,我需要一个基线的数据来显示并不是我的脚本本身导致了内存问题,也需要数据来显示该行为确实复制了内存泄漏 我计划通过将总内存使用量的定期报告写入日志文件来实现这一点。例如,在此框中,我的Windows任务管理器->性能选项卡显示我当前使用的是2.00GB中的1.67GB。这是我需要在代码中提取的数字,并定期转储到日志文件中 只有一个问

因此,我试图向我的上司证明该产品存在内存泄漏。但是,运行接触COM对象的脚本大约需要2小时才能复制到
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,是的