中线程内存使用情况的快速检查或限制.NET

本文关键字:检查 NET 内存 线程 用情 情况 | 更新日期: 2023-09-27 18:00:22

我见过一些类似于这个问题的讨论,但没有什么能真正回答我面临的问题。

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

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

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

谢谢!

中线程内存使用情况的快速检查或限制.NET

正如其他海报所示,在单独的过程中托管可能更容易。一个稍微轻一点的方法是在单独的应用程序域中托管,并使用应用程序域资源监控api来监控内存使用情况。

WMI是您的一个选择。我确信您可以监控进程内存使用情况。但你可以更多地探索这个想法。

以下是C#中WMI的小介绍。您可以查询一整套类。对于查询本地机器统计数据来说,成本不会很高。但我建议先拿一些性能数据。