【问题标题】:What's a reasonable amount of memory for a .NET application?.NET 应用程序的合理内存量是多少?
【发布时间】:2008-12-02 14:51:07
【问题描述】:

我收到了一些投诉,称我们的一个托管应用使用了 20-25Mb 的 RAM。我通常会反驳说内存很便宜。克服它。

这对于 Windows 窗体应用程序是否合理?

【问题讨论】:

  • 听说过“聪明到危险”的说法吗?最大的痛苦是那些知道足以引起麻烦但不足以意识到他们的担忧是没有根据的用户......
  • 我对桌面开发人员似乎已经陷入的“内存便宜”格言表示反对。当然,它很便宜,但这并不是糟糕的编码或糟糕的内存管理的借口。如果你最终转向一个项目的紧凑框架之类的东西,那句格言肯定会咬你。
  • 可能会让这个 MIX09 比赛有点棘手:2009.visitmix.com/MIXtify/TenKGallery.aspx
  • 我对“必须最小化所有 NAO”格言持异议。过早的优化包括在没有充分理由的情况下最大限度地减少内存占用。
  • @Will - 谁说过要进行优化?问题在于那些根本不考虑或不关心内存使用的开发人员(而且他们的人数正在增长)。这就像说使用 StringBuilder 而不是串联负载是一种优化。两者都有效,但只有一个是正确的。

标签: memory clr


【解决方案1】:

20-25MB 不算什么。

.Net 框架并不总是立即回收 RAM。随着时间的推移,我看到应用程序在“昂贵”的过程中达到了几百 MB RAM 的峰值,然后即使在“昂贵”的过程完成后也只是坐在那里。然而,这是一种误导。该应用程序未使用此 RAM。只是垃圾收集器还没有看到收集大量旧 RAM 的需要。如果操作系统需要该 RAM,请放心,它会被收集。应用程序最多只能使用几百 K 的想法不适用于 托管 环境 — 对于操作系统进程,是的。对于本机应用程序,也许。但不是托管代码。否则,您最终只会得到具有完整 GB 或更多 RAM 的系统处于空闲状态。

【讨论】:

    【解决方案2】:

    这个问题就像问“你可以在一个房间里放多少苹果”......

    首先我会反问“苹果有多大”...?

    然后我会用“房间有多大”来反驳......?

    当你回答了这些问题后,就可以给出一个粗略的估计。尽管意识到即使是 .Net 上的“Hello World”应用程序(以及 Java 也是如此)也可以占用几 KB 到几百 TB(理论上)之间的任何内容,因为 GC 主要是构建以便它们分配得很好根据可用内存量,池中的内存量非常大。因此,在内存稀缺的计算机上,.Net WinForms 应用程序可能需要少量内存,而在具有大量可用内存的系统上,即使对于“Hello World”,它也可能需要(理论上)TB... p>

    【讨论】:

      【解决方案3】:

      这很合理,是的。分配更多的内存比通过更频繁的 GC 来积极尝试降低堆大小要便宜。

      【讨论】:

        【解决方案4】:

        回击有一个潜在的正当理由:如果您的客户在终端服务环境中使用您的应用程序,并且十几个或更多用户共享 4GB 的 RAM,该怎么办?将您的 20 - 25 MB 添加到 Outlook 的 30+、IE 的 20+、Word 的 25+ 和 Excel 的 25+,乘以终端用户的数量,希望您能看到他们可能来自哪里。

        我认为,在当今时代,20 - 25 MB 是完全合理的。如果你是数百兆,那可能是另一回事。但这一切都因情况而异。

        【讨论】:

          【解决方案5】:

          RAM 究竟是什么意思?是工作集、私有工作集、虚拟内存等等等等?我刚刚启动了一个相当简单的 .Net 应用程序,它占用了 21MB 的工作集,即 21MB 的 RAM。但是它的私有工作集只有 4MB,因此系统和共享库占用了大约 17MB,即使我的应用程序没有加载也会使用这些库。

          然后我使用该应用程序进行了一些内存密集型工作,私有工作集增加到 28MB。然后我切换到另一个内存密集型应用程序,发现我的私人工作集现在是 8MB,尽管没有释放内存。

          一个应用程序对 RAM 的使用非常难以衡量,更难确定任何内存使用是否“过多”(当然,除了一些令人发指的事情之外)。

          除非您的客户使用经过深思熟虑的性能计数器测量来指示各种类型的内存使用情况,否则您实际上并不知道您的应用在他们的计算机上使用了多少内存。

          您并没有真正遇到内存问题,您遇到的可能是棘手的通信问题,具体取决于客户的技术知识。但是 RAM 很便宜听起来有点小题大做,可能不是您的最佳选择。

          【讨论】:

            【解决方案6】:

            这取决于应用程序在做什么。 20 - 25Mb 对我来说听起来并不多。

            我刚刚创建了一个非常简单的 Windows 窗体应用程序,上面几乎没有,它占用了 19 - 20Mb。 我认为这可能是 .NET 表单应用程序占用的最小内存量。

            【讨论】:

              【解决方案7】:

              不,这太离谱了。你称自己为程序员?我的上帝,伙计。刚开始时,我可以在一张打孔卡上放置 15 个应用程序(顺便说一句,我必须用一把生锈的脚趾甲剪打孔)。它们都在十五个 CPU 周期内完成,实际上是从无到有地创建了内存。

              你应该感到羞愧。立即辞职。

              【讨论】:

              • 您的实际需要的 CPU 周期?在我插入打孔卡之前,我已经完成了!
              • 今天迄今为止最有趣的帖子 :)
              【解决方案8】:

              你在做什么?用掉大约 20 本长篇小说的内存是否合理?这绝对是您的应用程序,而不仅仅是 .net 运行时开销?有问题的机器内存不足吗?它会降低性能吗?

              这和一千零一个问题是您需要回答的 :) 我个人认为这是一个可笑的巨大内存量......但后来我在手机上工作,20mb 大约是我能得到的最大内存远离最大堆大小:)

              【讨论】:

                【解决方案9】:

                如果您的用户正在使用任务管理器来检查您应用的内存使用情况,那么他们很可能正在查看 内存使用情况 列。正如斯蒂芬马丁所说,这是一种误导,因为该列实际上显示了应用程序的完整工作集。这包括:

                • 私有工作集 - 仅对您的进程私有的驻留页面。
                • 可共享工作集 - 可与其他进程共享的常驻页面。
                • 共享工作集 - 当前与其他进程共享的常驻页面。这是可共享工作集的子集。

                如果是这种情况,您可以通过手动将应用的完整工作集减少到其私有/共享工作集来玩一些小把戏。这是通过使用 Win32 API 调用 SetProcessWorkingSetSize(GetCurrentProcess(), -1, -1) 完成的。这是 Windows 在系统内存不足时无论如何都会做的事情,但是控制何时发生这种情况可以让您将 .NET 应用程序的完整工作集剥离到其私有/共享工作集。这个数字通常要小得多。

                小了多少?将您的应用程序最小化到任务栏执行相同的操作,因此您可以在不更改任何代码的情况下进行检查。

                【讨论】:

                  【解决方案10】:

                  如果您的应用程序的内存占用一再引起人们的注意,您至少应该看看您是否真的需要这个数量,或者它是否只是累积的低效率。减少内存占用通常也会带来速度的提升,进而增加客户的满意度。通常,这种抱怨还可能暗示其他效率低下,从用户的角度来看似乎有些臃肿。

                  【讨论】:

                    猜你喜欢
                    • 2019-01-30
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2010-11-23
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    相关资源
                    最近更新 更多