【问题标题】:winforms application memory usagewinforms 应用程序内存使用情况
【发布时间】:2023-03-12 13:35:01
【问题描述】:

无论如何我可以让我的应用程序告诉用户有多少内存,以及应用程序是否接近占用其中的大部分。

另外,你怎么知道机器给操作系统、显卡等提供了多少内存。 .

例如,如果你有 4gb 的内存,实际分配给应用程序的内存有多少,你可以这样配置吗?

【问题讨论】:

    标签: c# winforms memory


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      如果您不想使用 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 的遗留解决问题有关。

      祝你好运

      【讨论】:

        【解决方案3】:

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

        是的,这是可能的(请参阅其他一些答案),但您的应用程序不太可能真正需要关心。在你认为需要对记忆压力如此敏感的地方,你在做什么?

        另外,你怎么知道机器给操作系统、显卡等提供了多少内存。 .

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

        例如,如果你有 4gb 的内存,实际分配给应用程序的内存有多少,你可以配置这个吗?

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

        【讨论】:

          【解决方案4】:

          我想我对这个问题的理解有点不同,所以希望这个回答不会太离题!

          您可以使用 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 架构下的游戏变化。 :)

          一些很好的参考资料:

          Memory Limits for Windows Releases

          Virtual Address Space

          【讨论】:

            猜你喜欢
            • 2011-03-09
            • 1970-01-01
            • 1970-01-01
            • 2011-07-23
            • 2020-09-12
            • 2013-05-11
            • 2014-11-08
            • 2015-01-13
            • 1970-01-01
            相关资源
            最近更新 更多