在.NET中,当你最小化程序时,垃圾回收器会被调用吗?

16

我用C#创建了一个程序,它使用了大约60-70 MB的内存。但是当我将该程序最小化时,它所需的内存较少,即只有10 MB。

当我将该程序最大化或返回到该程序时,它使用了20 MB...

这是为什么呢?

当您最小化程序时,垃圾回收器是否被调用是真的吗?

6个回答

23

这与垃圾收集无关——非.NET程序也会出现此问题(尝试在查看浏览器的内存占用时将其最小化)。

一旦你最小化一个程序,Windows操作系统将不再需要保留UI组件在内存中,因此内存需求更低。

也就是说,当应用程序被最小化时,Windows会调整工作集。

请参阅Channel9线程和KB文章(感谢@Sasha Goldshtein)。


@Anirudha - 你有什么特别的原因没有接受这个答案吗? - Oded
@Oded,请查看我回答中提供的链接。我认为这正是我想知道的。但是你的回答也很接近它。 - Anirudha
@Oded,请查看文章中的“.net urbun legand”部分...那里提供了有用的信息... - Anirudha
@Anirudha - 我已经做了。它本质上是对我之前回答的补充。 - Oded

8
垃圾回收器会在它决定运行时运行;这不一定与用户的任何操作相关,当然也不会减少应用程序。通常,您可以将其视为内存使用量与总空闲内存量之比的函数。但是,重点是,作为程序员,这应该是您无法理解的。垃圾回收相对于手动内存管理的最大优势是您不必担心任何这些问题。
我猜测您正在使用Windows任务管理器监视应用程序的内存使用情况并确定何时进行垃圾回收。这是一个巨大的错误。如果您真的需要进行内存分析,则需要投资于适当的分析工具。任务管理器不适用于此,并且您经常会得到错误的读数。
更具体地说,当你最小化应用程序时,你会发现应用程序消耗的内存量显著减少的原因之一,只是在使用任务管理器进行内存分析时会得到错误读数之一。实际上,每当你最小化一个应用程序时,Windows内核会自动将它所使用的大部分内存页面出去。你会看到这个情况发生在所有应用程序上,而不仅仅是.NET写的应用程序。因为任务管理器显示的是应用程序在实时内存中使用的子集(即尚未分页到磁盘的数量),所以看起来内存使用量已经减少了,但实际上并没有。为了获得稍微更准确的读数,你应该查看进程的“私有字节”值。这篇知识库文章提供了更多细节。

3
本文将为您解释:内存之谜
以下是来自上述网站的摘录:
.Net都市传说
有一种说法认为,通过在 .Net Windows窗体应用程序加载后立即最小化和最大化该应用程序,可以减少应用程序的工作集大小。 当应用程序被最小化时,Windows操作系统将修剪应用程序的工作集。 这个过程中刚刚使用的所有程序集加载期间使用的内存将被修剪。 您可以通过创建并运行只带有Form1但没有任何其他代码的Windows窗体应用程序来向自己展示这种行为。
1. 创建并运行简单的应用程序。 2. 打开Windows任务管理器,然后转到其进程选项卡。您会看到任务管理器显示您的应用程序的内存使用量约为12.5 MB。 3. 现在最小化您的应用程序,然后将其最大化。再次检查任务管理器。您会看到任务管理器现在显示您的应用程序的内存使用量约为1.5 MB。当您最小化应用程序时,内存管理机制将回收启动时加载程序集时使用的内存。 通过最小化和最大化应用程序,您是否改善了内存管理或应用程序性能?不是。 您可能会发现一些 .Net Windows程序员添加代码以最小化然后最大化其程序,认为这样可以优化内存。 由于这些程序员已经与其他人分享了这种技术,因此产生了某种 .Net都市传说——一种基于虚构而非事实的编程实践。 此实践是不必要的,因为当操作系统需要未使用的内存时,它将自动回收它。 实际上,在内存充足时减少应用程序的工作集大小可能会降低性能。

1

不要只看任务管理器,而应该使用 PerfMon 工具查看应用程序的内存消耗。您将看到实时内存使用情况,可以通过以下计数器来检查:

Process->VirtualBytes:Virtual Bytes 是进程正在使用的虚拟地址空间的当前大小(以字节为单位)。虚拟地址空间的使用并不一定意味着相应地使用了磁盘或主存储器页面。虚拟空间是有限的,并且进程可以限制其加载库的能力。


在我看来,对某个帖子进行负评应该强制要求说明原因。 - Ignacio Soler Garcia
我再重复一遍。如果你要给负评,请说明原因或者不要负评。 - Ignacio Soler Garcia

0

.NET 中的垃圾回收发生在所有对象死亡或关闭程序时。你也可以在.NET中调用垃圾收集器,但这不是通常的做法。而在最小化模式下,尽管程序仍在工作(或保持存活状态或你能称之为其他任何名称),但用户并未将其置于焦点或主动使用。因此,分配给该程序的内存使用(系统资源)会减少,以便其他程序可以使用系统资源。


-2
你是如何确定程序使用的内存量的?
我认为Windows Forms通常会调用SetProcessWorkingSetSize尽可能地从RAM中剔除页面。

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