【问题标题】:Fast checking or limiting of thread memory usage in .NET?在 .NET 中快速检查或限制线程内存使用?
【发布时间】:2011-06-26 23:25:20
【问题描述】:

我看到了一些与此问题类似的讨论,但没有任何内容能真正回答我所面临的问题。

我正在开发一个可以通过解释脚本自定义软件行为的 C# 应用程序。每个脚本都在 C# 应用程序的不同子线程上运行。 (我正在使用 Jint javascript 解释器来运行脚本,但我的问题对于线程可以在 .NET 应用程序中动态运行的任何其他情况同样有效)。到目前为止,这工作得很好。但我需要确保应用程序能够自行运行。如果出现可能导致应用程序耗尽堆空间的错误脚本,我需要能够检测并停止任何占用过多内存的线程。从概念上讲,这可以看作类似于 Web 浏览器确定页面上的 javascript 是否需要太长时间或太多内存来执行。问题是,我无法确定 .NET 中是否有任何方法可以做到这一点。

有什么方法可以对线程可以使用的内存量进行硬性限制,或者从父线程快速检查线程的内存利用率?我不关心线程内的堆栈溢出,只关心堆空间。

“显而易见”的解决方案当然是将解释拆分为单独的进程而不是单独的线程,但这会对我的应用程序产生重大的性能影响,因为这些脚本会修改软件行为,因此旨在紧密耦合.应用程序级别的监控也不理想,因为它不会提供有关哪个脚本本身没有运行的信息。此外,用于调试的慢速方法将不起作用,因为脚本旨在允许快速修改软件,而不必构建、测试和重新部署。我只需要一些相当快速的方法来检测占用过多内存的线程,这样我就可以杀死并忽略它的脚本。

谢谢!

【问题讨论】:

  • “我正在开发一个 C# 应用程序,可以通过解释脚本自定义软件行为。每个脚本都在 C# 应用程序的不同子线程上运行”-?如果您所做的只是自定义应用程序。为什么脚本需要在不同的线程上运行?
  • “因为这些脚本修改了软件行为,因此旨在紧密耦合” - 我听到紧密耦合脚本这个词,我开始怀疑设计......
  • 如果你想限制内存使用,那么我认为你最好使用单独的进程。如果某些脚本存在危险,您绝对无法控制不玩游戏,那么我会确保它无论如何都在单独的进程上运行。我不确定您是否可以限制每个线程所需的方式,因为如果有任何 API 可用,它将是一个 Windows API,据我所知,您无法为其映射托管线程和 Windows 线程有任何用处。
  • 脚本改变了软件的行为,所以进程间通信会花费他。虽然在单独的进程中运行这样的脚本是更好的想法/解决方案。

标签: c# multithreading memory


【解决方案1】:

正如其他海报所暗示的那样,在单独的进程中托管可能更容易。一种稍微轻量级的方法是托管在单独的应用程序域中并使用app-domain resource monitoring api 来监控内存使用情况。

【讨论】:

    【解决方案2】:

    WMI 是您的一种选择。我确定您可以监控进程内存使用情况。但是您可以进一步探索这个想法。

    Here is small intro to WMI in C#。您可以查询一整套类。对于查询本地机器统计信息,它不会很昂贵。但我建议先获取一些性能数据。

    【讨论】:

    • 我认为这种方法的问题在于托管线程和windows线程之间没有一对一的关系。
    猜你喜欢
    • 2018-04-07
    • 2011-03-10
    • 1970-01-01
    • 1970-01-01
    • 2010-11-15
    • 1970-01-01
    • 1970-01-01
    • 2011-02-15
    • 1970-01-01
    相关资源
    最近更新 更多