Delphi - 最小化和恢复是否会释放内存?

9
我多年来一直涉猎Delphi,我一直想知道为什么最小化和还原应用程序会导致它使用更少的内存?以Delphi 7为例,我创建了一个新项目,只有空白表单,然后按F9运行应用程序,查看应用程序的内存使用情况,它的内存占用率约为3.5MB。然后我将应用程序最小化,内存使用量下降到约760KB,最后我还原应用程序,内存使用量回升到约1.5MB,这大概是它最初加载时的一半,我一直很困惑这是什么原因,并且更重要的是是否有任何方法可以通过某些指令使应用程序使用1.5MB的内存而不是通常使用的3.5MB。
谢谢, Dave

"Memory(内存)" 是一个非常模糊的概念。您看到的是工作集正在减少。您可能会发现这篇文章有用:http://blog.eurekalog.com/catching-memory-leaks/ - Alex
只有在你在微软工作足够长时间后,这才变得模糊不清。 - Warren P
3个回答

5

谢谢回复,我只是好奇而已,现在至少我知道不仅仅是我的应用程序出现了这种情况。再次感谢, 戴夫 - dave
这是一个很好的Windows示例,通常当我弄清楚他们做了什么时,我会说:“[在此插入大声的咒骂语句] 我简直不敢相信他们会这样做!” Windows有点欺骗你,因为他们无法确定哪些信息最接近你想要知道的信息,例如这个应用程序使用了多少内存。所以他们选择了其中一件他们知道如何计算的事情,并用用户友好但不准确的短标签进行标记;“这就是你要找的”,显然并不是。 - Warren P

4

在这里你可以找到Ian Martins提供的非常清晰的解释。 当应用程序最小化时,系统调用SetProcessWorkingSetSize过程以释放进程中不活动的内存。

您可以通过将以下代码添加到您的应用程序中来执行相同的操作。在按钮OnClick事件中,您可以这样做:

procedure LiberarMemoria;
begin
  if Win32Platform = VER_PLATFORM_WIN32_NT then
    SetProcessWorkingSetSize(GetCurrentProcess, $FFFFFFFF, $FFFFFFFF);
end;

效果类似于最小化应用程序。 如果您的应用程序执行一些最终使用大块内存的任务,则可以使用此小代码在使用后强制释放它。
敬礼

2
引用指定链接中的内容:“最简单的方法是从计时器运行,例如每分钟一次。” 是啊,没错。为了你自己的利益,请远离这篇文章。 - Alex
1
@Alexander,请仔细检查并阅读我的评论,看看我是否建议每分钟释放内存。 我说过: “……如果您的应用程序执行某些任务最终会使用大块内存,您可以在使用后强制释放它” (1)最终 (2)使用后再释放,而不是每分钟。 我已经为了解释和代码而推荐了这种方法。请仔细阅读回复。 P.D:对于英语错误请谅解。 - Germán Estévez -Neftalí-
@Neftalí - 我没有说过你说了这个!我是说你推荐了一篇文章,建议这样做。 - Alex
5
SetProcessWorkingSetSize函数不会释放内存,它只是告诉操作系统将所有内容分页到磁盘上。这将立即降低性能。当稍后需要使用那些被换出到磁盘的页面时,会再次降低性能,因为它们要重新被分页回内存中。更好的策略是不操作,让操作系统在需要时自行将页面分页至磁盘。 - Rob Kennedy
很棒的讨论正在进行中,感谢大家的回复和信息。我并没有真正计划使用上述描述的函数,我只是好奇它是如何实现的。我尽力编写高效的代码,正如Rob所说,让操作系统自己处理。祝好, Dave - dave
显示剩余2条评论

1

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