C#中的内存使用情况

18

我有一个使用C#中的线程的程序。有没有一种方法可以编程方式知道应用程序的内存使用情况?我想限制生成的线程到10兆字节的内存,我该如何做到这一点?


19
一旦你开始控制内存,就开始犯错误。如果你对内存有要求,就不要使用.NET。如果没有要求,就不要担心内存。.NET比你能做得更好地管理内存。停止吧,别管它了,不要这样做。 - user1228
1
我同意威尔的观点。只要你当前引用的对象在32位系统上低于2GB的内存,就让GC来处理它。 - Steve
1
如果您有特定的内存需求,而这些需求不是胡说八道或无法通过管理解决(HURR DURR LOOK AT ALL THE MEMORY UR PROGRAM TAKES IN TASK MANAGER HURR DURR),那么您需要使用 C++ 或 C 进行编码,这些语言更接近底层,您可以控制内存分配。个人而言,我认为这种方式太麻烦了。 - user1228
3
@yoitsfrancis:如果你有一个服务应用程序,想要防止它成为内存占用过多的问题,那么你需要表明这一点。我认为这样的要求并不是不合理的,GC 的工作不是限制内存需求。 - AnthonyWJones
5
我认为他并不是在试图控制内存,使每个线程都小于10MB。我认为他试图控制产生的线程数量,以便确保进程不超过10MB,这是一个合理的要求。他需要自己决定他的应用程序是否值得这样做。 - Joseph
显示剩余3条评论
4个回答

25

如果你想获取整个正在运行的进程的内存,而不是基于每个线程的内存,那么可以这样:

// get the current process
Process currentProcess = System.Diagnostics.Process.GetCurrentProcess();

// get the physical mem usage
long totalBytesOfMemoryUsed = currentProcess.WorkingSet64;

除了 WorkingSet64 之外,还有许多其他进程内存属性,请查看以下链接中的“与内存相关”的属性,选择最适合您的属性。

http://msdn.microsoft.com/zh-cn/library/system.diagnostics.process_properties.aspx


4

虽然我同意你已经收到的评论,但如果你真的决定采取这种做法,使用System.Environment.WorkingSet可能是一个实际的答案。


1

我和威尔以及史蒂夫都认为,除非你真的必须这么做,否则不要这样做……话虽如此……

如果你确实需要这样做,你可以使用 .Net Hosting APIs。它们存在的目的是让应用程序(如 SQL Server)在应用程序内部托管 .net 框架。

这样可以让你控制内存管理等方面。我已经阅读了这篇文章,但从未使用过这些 API,它们在我的待办清单上,等到某个晚上我感到无聊,而我的其他“有趣”项目又不再有趣时,我会去尝试一下 :)

希望这能帮到你。


1

你不应该通过内存使用量来衡量线程数量。相反,考虑到“处理器”的数量(SMP / 多核 / 超线程)来决定有多少个线程应该并行运行。或者使用 ThreadPool,它会自动调整大小以实现良好的线程与 CPU 比例。


嗯...你在泛化。 如果线程使用的内存量是不可预测的呢? - majkinetor
如果数量是不可预测的,那么只有当线程已经运行时才会知道遇到了问题。因此,如果您正在处理可能导致大量内存使用的数据,则无论有多少个线程正在运行或将要运行,您都必须始终注意此问题。 - Lucero

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