我见过类似这个问题的一些讨论,但没有什么可以真正回答我所面临的问题。
我正在开发一个C#应用程序,可以通过解释脚本自定义软件行为。每个脚本都在C#app的不同子线程上运行。 (我正在使用Jint javascript解释器来运行脚本,但我的问题同样适用于线程在.NET应用程序中动态运行的任何其他情况)。到目前为止,这工作得很好。但我需要确保应用程序本身的行为。如果一个错误的脚本可能导致应用程序耗尽堆空间,我需要能够检测并停止占用过多内存的任何线程。从概念上讲,这可以看作类似于Web浏览器,确定页面上的javascript是否占用太长或太多的内存来执行。问题是,我无法确定在.NET中是否有任何方法可以做到这一点。
我是否可以通过某种方式对线程可以利用的内存量进行硬限制,或者从父线程快速检查线程的内存利用率?我不关心线程中的堆栈溢出,只关心堆空间。
“显而易见”的解决方案当然是将解释拆分为单独的进程而不是单独的线程,但这会对我的应用程序造成重大的性能损失,因为这些脚本会修改软件行为,因此旨在紧密耦合。应用程序级监视也不是理想的,因为它不提供有关哪个脚本本身不表现的信息。此外,用于调试的慢速方法将无法工作,因为脚本旨在允许快速修改软件,而不必进行构建,测试和重新部署。我只需要一些合理快速的方法来检测一个占用太多内存的线程,这样我就可以杀死并忽略它的脚本。
谢谢!
答案 0 :(得分:3)
正如其他海报所说,在单独的过程中主持可能更容易。稍微轻量级的方法是在单独的应用程序域中托管,并使用app-domain resource monitoring api来监视内存使用情况。
答案 1 :(得分:0)
WMI是您的唯一选择。我确信您可以监视进程内存使用情况。但你可以更多地探索这个想法。
Here is small intro to WMI in C#。您可以查询一整套类。而对于查询本地机器统计数据,它不会非常昂贵。但我建议首先考虑一些性能数字。