winforms应用程序内存使用情况

时间:2009-04-18 12:09:58

标签: c# winforms memory

无论如何我可以让我的应用程序告诉用户有多少内存,以及应用程序是否接近占用了很高的百分比。

另外,您如何知道机器为操作系统,视频卡等提供了多少内存。

例如,如果你有4GB的内存,给应用程序多少实际内存,你可以配置它。

4 个答案:

答案 0 :(得分:2)

  

无论如何我可以让我的应用程序告诉用户有多少内存,以及应用程序是否接近占用了很高的百分比。

是的,这是可能的(请参阅其他一些答案),但您的应用程序确实不太可能需要关注。你认为自己需要对记忆压力敏感的是什么?

  

另外,您如何知道机器为操作系统,视频卡等提供了多少内存。

同样,这个应该可以使用WMI调用,但更大的问题是为什么你需要这样做?

  

例如,如果你有4GB的内存,给应用程序多少实际内存,你可以配置它。

不,这不是可配置的值。当.NET应用程序启动时,操作系统会为其分配一块内存供其使用。这由OS处理,无法配置用于确定要分配的内存量的算法。同样,没有办法配置.NET运行时用于托管堆,堆栈,大对象堆等的内存量。

答案 1 :(得分:2)

我认为我对这个问题的看法略有不同,所以希望这个回答不是太偏离主题!

通过使用Windows任务管理器,甚至更好的Sysinternals Process Monitor,您可以很好地了解应用程序消耗的内存量。这是一种快速查看流程峰值的方法,以了解它们的行为方式。

开箱即用,x86进程只能处理2GB内存。这意味着您机器上的任何单个进程最多只能消耗2GB。实际上,在内存异常出现之前,您可能只能消耗1.5-1.8。

您的Windows副本实际可以解决的内存量取决于Windows版本和CPU体系结构。

使用4GB RAM的示例,操作系统将为您的应用程序提供最多2GB的RAM(所有进程共享),并为自己保留2GB。

根据您运行的操作系统,您可以调整它,使用boot.ini中的/ 3GB开关,将该比率调整为3GB(对于应用程序)和1GB(对于OS)。这对操作系统有一些影响,所以我先审查一下这种影响,看看你是否可以接受权衡(YMMV)。

对于单个应用程序能够处理大于/ 3GB的内容,您需要在PE映像头中设置特定位。这个question/answer已有关于此主题的良好信息。

游戏在x64架构下发生了变化。 :)

一些很好的参考信息:

Memory Limits for Windows Releases

Virtual Address Space

答案 2 :(得分:0)

我认为您可以使用WMI获取所有信息

答案 3 :(得分:0)

如果您不想使用WMI,可以使用GlobalMemoryStatusEx():

功能调用:
http://www.pinvoke.net/default.aspx/kernel32/GlobalMemoryStatusEx.html

返回数据:
http://www.pinvoke.net/default.aspx/Structures/MEMORYSTATUSEX.html

MemoryLoad将为您提供0到100之间的数字,表示正在使用的物理内存的百分比,TotalPhys将告诉您总物理内存总量(以字节为单位)。

内存很棘手,因为可用内存是物理(ram)和虚拟(页面文件)类型的混合。特定的混合,以及在哪里,由操作系统决定。幸运的是,这有点可配置,因为Windows允许您规定要使用多少虚拟内存,如果有的话。

请注意,并非32位Windows(XP和Vista)中的所有内存都可以使用。 Windows可能会报告最多安装4GB,但操作系统和应用程序实际使用的只有3.1-3.2GB。这与传统寻址问题IIRC有关。

祝你好运