你的程序需要多少内存? (FastMM vs Borland MM)

时间:2010-12-21 12:31:23

标签: delphi fastmm

我最近在程序中看到了一个奇怪的行为。在创建大量对象(500MB RAM)然后释放它们之后,程序的内存占用量不会恢复到原始大小。它仍然显示160MB(私人工作集)的足迹。

正常行为?

Borland的内存管理器不是这样的,所以如果可能请确认(或体弱)这是FastMM的正常行为:如果你有一个方便的程序,你在其中创建一个相当复杂的MDI子(包含几个控件/对象) ),你可以在内存中创建250个MDI子实例(同时)然后释放它们并检查内存占用。请确保您与这些MDI孩子消耗至少200-300MB或RAM。

特别是那些仍在使用Delphi 7的人可以通过临时禁用FastMM来看到差异。

由于


如果有人感兴趣,特别是如果你想要一些证据这不是内存泄漏(我希望它不是我的代码中的内存泄漏 - 这也是这篇文章的要点之一:检查它是否是我的这是最初的讨论:

My program never releases the memory back. Why?
How to convince the memory manager to release unused memory

5 个答案:

答案 0 :(得分:2)

IIRC,Delphi内存管理器不会立即将自由内存返回给操作系统。

内存以小型,中型和大型的块分配,称为块。 这些块在其内容被处理后保留一段时间,以便在之后请求另一个分配时可以随时使用它们。

这限制了多个对象连续分配所需的系统调用量,并有助于避免堆碎片。

答案 1 :(得分:2)

Infirming:Delphi 2007,默认内存管理器(应该是FastMM变体)。对重物进行多次测试:

  1. 初始内存2Mb,峰值内存30Mb,最终内存4Mb。
  2. 初始内存2Mb,峰值内存1Gb,最终内存5.5Mb。

答案 2 :(得分:2)

答案 3 :(得分:1)

仍然分配了160MB的堆管理器统计信息(GetHeapStatus)是什么?

答案 4 :(得分:1)

解决

要确认此行为是由FastMM生成的(正如Barry Kelly所建议的那样),我创建了第二个分配了大量RAM的程序。一旦Windows用完RAM,我的程序内存利用率就恢复到原来的值。

问题解决了。特别感谢Barry Kelly,他是唯一一个指出真正“问题”的人。