Ani*_*dha 15 .net windows garbage-collection
我用C#创建了一个程序.该程序使用了大约60-70 MB的内存.但是当我最小化该程序时,它需要更少的内存,即只需10 MB.
当我最大化或回到该程序时它使用了20 MB ......
为什么会这样?
当你最小化程序时,垃圾收集器是否被调用?
Ode*_*ded 23
这与垃圾收集无关 - 这也适用于非.NET程序(尝试在查看内存占用时最小化浏览器).
在最小化程序的那一刻,Windows操作系统将不再需要将UI组件保留在内存中,因此内存需求较低.
也就是说 - 当应用程序最小化时,窗口会修剪工作集.
请参阅此 channel9主题和此知识库文章(感谢@Sasha Goldshtein).
垃圾收集器在决定运行时运行; 这不一定与用户所做的任何事情有关,当然也不会最小化应用程序.通常,您可以将其视为与可用内存总量相比的内存使用量的函数.但重点是,作为一名程序员,这对你来说应该是有些不透明的.垃圾收集相对于手动内存管理的最大好处是您不必担心任何此类问题.
我怀疑你的问题是你正在使用Windows任务管理器监视应用程序的内存使用情况并确定何时发生垃圾收集.这是一个巨大的错误.如果您确实需要进行内存分析,则需要投资适当的分析器.任务管理器不是为此而设计的,您经常会得到错误的读取.
更具体地说,当您最小化应用程序时,您似乎看到应用程序消耗的内存量显着减少的原因只是在尝试使用任务管理器进行内存分析时会得到的错误读取之一.实际上,无论何时最小化应用程序,Windows内核都会自动将其正在使用的大部分内存分页.您将在所有应用程序中看到这一点,而不仅仅是那些用.NET编写的应用程序.因为任务管理器向您显示当时存在于实际内存中的应用程序正在使用的总内存的子集(即,尚未分页到磁盘的数量),所以看起来内存使用量减少了它没有真的.为了获得更准确的读取,您应该查看进程的"私有字节"值.此知识库文章提供了更多详细信息.
这篇文章解释了一切:记忆之谜
\n这是上述网站的摘录:
\n.Net 都市传奇
\n\n\n通过最小化应用程序,然后在加载后立即最大化应用程序,可以减少 .Net Windows 窗体应用程序的工作集大小。\n 当应用程序最小化时,Windows 操作系统会修剪应用程序的工作集。加载前面提到的所有程序集时短暂使用的内存将通过最小化和最大化应用程序的过程进行修剪。您可以通过创建并运行仅使用 Form1 且不添加任何代码的 Windows 窗体应用程序来向自己演示此行为。
\n\n
\n- \n
创建并运行简单的应用程序。
\n- \n
打开 Windows 任务管理器,然后打开其进程选项卡。您将看到任务管理器显示您的应用程序\xe2\x80\x99s 内存使用情况约为\n12.5 MB。
\n- \n
现在最小化您的应用程序,然后最大化它。再次检查任务管理器。您将看到任务管理器现在显示您的\napplication\xe2\x80\x99s 内存使用情况大约为 。1.5 MB。当您最小化应用程序时,\n\n内存管理会回收\n启动应用程序时用于加载程序集的内存。
\n您是否通过最小化和\n最大化应用程序来改进内存管理或应用程序性能?不。您可能会发现一些 .Net Windows\n程序员添加代码来最小化然后最大化他们的程序\n认为他们正在优化内存。由于这些程序员与其他人分享了这种技术,一种 .Net Urban Legend 诞生了,\xe2\x80\x93 是一种基于虚构而不是事实的编程实践。这种做法是不必要的,因为当操作系统需要加载程序集时留下的未使用的内存时,它会自动回收它。事实上,在内存充足时减小应用程序\xe2\x80\x99s\n工作集的大小可能会降低性能。
\n
| 归档时间: |
|
| 查看次数: |
1839 次 |
| 最近记录: |