如何确定我的.NET应用程序的内存使用情况

9

我有一个网站,用户可以上传他们的dll文件。我需要从这个dll文件中创建一个实例并调用其中特定的方法。而且,我需要在一个进程中使用多个dll文件,所以对我来说不能使用System.Diagnostics.Process。

有没有一种方法可以确定这个方法调用使用了多少内存或在应用程序运行时限制它的使用?

非常感谢任何帮助!


顺便说一句,如果我们中的任何人回答了您的问题,您可以通过点击问题旁边的勾号接受答案。谢谢。 - Basic
4个回答

8

.Net中的内存使用很难衡量 - 它将取决于许多因素,例如垃圾回收是否运行,加载了多少框架等。

您可以使用性能计数器以每个进程级别查看内存使用情况

假设您已经考虑过在半受信任的环境中运行用户代码的安全性问题,您需要使用AppDomain来加载DLL - 这样可以在不重启整个网站/工作进程的情况下卸载它。


非常感谢您的回答。 我会尽力更准确地解释我需要什么。 :) 我的项目是为开发人员设计的游戏,他们需要上传他们的代码并“对抗”彼此。 因此,在上传了一些dll之后,我们可以创建一个回合来确定谁获胜:)。 我考虑在单独的进程中创建这个回合,并在该进程中从上传的dll中创建实例并调用方法。我需要限制这些实例的内存使用情况,因此如果开发人员超出了此限制,则输掉了比赛。 - Andrey
1
啊,现在我明白了。肯定需要单独的进程 - 根据你预计同时托管的数量,甚至可以考虑每个 DLL 一个进程的方式 - 这样你仍然可以使用性能计数器监控内存使用情况。 - Basic
另一个选择是向开发人员公开一个“堆”(例如Byte())或者更聪明一些的东西(例如Dictionary),让他们必须使用它来存储所有变量 - 然后您可以显式地控制Byte()并使用反射确保他们不会在其程序集中分配内存。 - Basic
哦,我怎么之前没能自己找到这个解决方案呢 :) 非常感谢。 但是我会先尝试使用性能计数器。这对我来说是一个新的有趣的事情 :) - Andrey
1
很高兴能帮到你 :) 欢迎来到SO - 希望未来能经常见到你。 - Basic
显示剩余2条评论

5
如果您使用的是.NET 4.0,请查看MemoryFailPoint
另一个建议:.NET 4.0现在提供了监视AppDomain内存消耗的功能(AppDomain.MonitoringIsEnabled Property)。例如,您可以使用主AppDomain来轮询和关闭一个AppDomain,如果它使用了太多的内存。

4

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接