【发布时间】:2023-03-12 13:35:01
【问题描述】:
无论如何我可以让我的应用程序告诉用户有多少内存,以及应用程序是否接近占用其中的大部分。
另外,你怎么知道机器给操作系统、显卡等提供了多少内存。 .
例如,如果你有 4gb 的内存,实际分配给应用程序的内存有多少,你可以这样配置吗?
【问题讨论】:
无论如何我可以让我的应用程序告诉用户有多少内存,以及应用程序是否接近占用其中的大部分。
另外,你怎么知道机器给操作系统、显卡等提供了多少内存。 .
例如,如果你有 4gb 的内存,实际分配给应用程序的内存有多少,你可以这样配置吗?
【问题讨论】:
我认为您可以使用 WMI 来获取所有这些信息
【讨论】:
如果您不想使用 WMI,可以使用 GlobalMemoryStatusEx():
函数调用:
http://www.pinvoke.net/default.aspx/kernel32/GlobalMemoryStatusEx.html
返回数据:
http://www.pinvoke.net/default.aspx/Structures/MEMORYSTATUSEX.html
MemoryLoad 会为您提供一个介于 0 和 100 之间的数字,表示正在使用的物理内存的百分比,TotalPhys 会告诉您物理内存的总字节数。
内存很棘手,因为可用内存是物理(内存)和虚拟(页面文件)类型的混合。具体的混合,以及去哪里,由操作系统决定。幸运的是,这在某种程度上是可配置的,因为 Windows 允许您规定要使用多少虚拟内存(如果有的话)。
请注意,并非 32 位 Windows(XP 和 Vista)中的所有内存都可供使用。 Windows 可能报告最多安装了 4GB,但只有 3.1-3.2GB 可供操作系统和应用程序实际使用。这与 IIRC 的遗留解决问题有关。
祝你好运
【讨论】:
无论如何我可以让我的应用程序告诉用户有多少内存,以及应用程序是否接近占用其中的高比例。
是的,这是可能的(请参阅其他一些答案),但您的应用程序不太可能真正需要关心。在你认为需要对记忆压力如此敏感的地方,你在做什么?
另外,你怎么知道机器给操作系统、显卡等提供了多少内存。 .
同样,这应该可以使用 WMI 调用,但更大的问题是为什么需要这样做?
例如,如果你有 4gb 的内存,实际分配给应用程序的内存有多少,你可以配置这个吗?
不,这不是一个可配置的值。当 .NET 应用程序启动时,操作系统会分配一块内存供其使用。这是由操作系统处理的,无法配置用于确定要分配的内存量的算法。同样,无法配置 .NET 运行时将多少内存用于托管堆、堆栈、大型对象堆等。
【讨论】:
我想我对这个问题的理解有点不同,所以希望这个回答不会太离题!
您可以使用 Windows 任务管理器或更好的 Sysinternals Process Monitor 来很好地了解您的应用程序消耗了多少内存。这是一种在高峰期查看流程以了解其行为方式的快速方法。
开箱即用,x86 进程只能寻址 2GB 的 RAM。这意味着您机器上的任何单个进程最多只能消耗 2GB。实际上,在出现内存不足异常之前,您可能只能消耗 1.5-1.8。
您的 Windows 副本实际可以处理多少 RAM 取决于 Windows 版本和 cpu 架构。
以您的 4GB RAM 为例,操作系统将为您的应用程序提供高达 2GB 的 RAM 供您使用(所有进程共享),并且它会为自己保留 2GB。
根据您运行的操作系统,您可以对此进行调整,使用 boot.ini 中的 /3GB 开关,将应用程序的比率调整为 3GB,操作系统的比率为 1GB。这对操作系统有一些影响,所以我会先回顾一下这种影响,看看你是否可以接受权衡 (YMMV)。
要使单个应用程序能够处理大于/3GB 的地址,您需要在 PE 映像头中设置一个特定位。这个question/answer 已经有很好的关于这个主题的信息了。
x64 架构下的游戏变化。 :)
一些很好的参考资料:
【讨论】: