【问题标题】:Is Windows Task Manager a reliable tool for detecting a memory leak?Windows 任务管理器是检测内存泄漏的可靠工具吗?
【发布时间】:2017-12-11 00:41:03
【问题描述】:

如果一个 TObject 被创建,它必须在最后被销毁。在开发的过程中,我遇到了正在运行的应用程序在短时间内反应很慢,我在Windows任务管理器中注意到它运行一段时间后消耗了大量的内存。 我做了一些改变,但我仍然看到很少的渐进式内存消耗。该应用程序有大约 22,000 Kb 的内存,经过反复重绘,包括创建和销毁对象,它增加到 33,000。

这是一个明确的迹象,表明我在代码中的某处没有正确释放对象,还是有其他原因导致内存泄漏?有没有一种方法可以轻松调试这个问题?

我一直非常注意以正确的方式创建和销毁对象,所以我没有看到明显的失败。

【问题讨论】:

  • 不可能从这里说你是否有泄漏。在完全调试中使用 FastMM 来检测泄漏。
  • 这根本不是内存泄漏的迹象。内存管理器可以只保留未使用的内存块供以后使用。所以即使你释放了所有使用过的对象,也可能会有内存管理器计划在之后使用的内存块。

标签: delphi


【解决方案1】:

可以在调试模式下通过将其添加到项目源代码中来报告内存泄漏:

{$WARN SYMBOL_PLATFORM OFF}
ReportMemoryLeaksOnShutdown := DebugHook <> 0;

Go Project > View Source 找到这个并将上面的行放在 Application.Initialize 之前。它应该看起来像这样:

  begin
    {$WARN SYMBOL_PLATFORM OFF}
    ReportMemoryLeaksOnShutdown := DebugHook <> 0;
    {$WARN SYMBOL_PLATFORM ON}
    Application.Initialize;
    Application.MainFormOnTaskbar := True;
    Application.CreateForm(TfrmMain, frmMain);
    Application.Run;
  end.

【讨论】:

  • 嗯,我从未见过使用DebugHook...我通常只使用条件{$IFDEF DEBUG} ...
  • 它是 IDE 中非常方便的工具,专门用于旧版本,无需引入开源或第三方工具。
  • 我的意思是我知道ReportMemoryLeaksOnShutdown,但不知道DebugHook &lt;&gt; 0 部分。
  • 对,分配给DebugHook 0表示只在调试时报告。
  • 将此与使用 FastMM4 或 LeakCheck 结合起来,您将获得有关分配调用堆栈和其他内容的有用信息,而不仅仅是“有一些 15 x TFoo 和 4 x TBar 泄漏”,因为您只需转动 @ 987654327@开。
【解决方案2】:

检查内存泄漏的最佳方法是使用检查内存泄漏的工具任务管理器仅报告内存使用情况,并且内存使用可能出于正当原因而增加,而不仅仅是内存泄漏。

此外,Delphi 应用程序内存由 Delphi 内存管理器管理。 Delphi 内存管理的工作方式可能给人一种内存泄漏的印象,这是由于从系统中回收未使用的内存的方式(即通常仅在必要时,因为回收未使用的内存比必须返回到操作系统重新分配已返回给操作系统的内存)。

在仅通过监视内存使用情况来检测内存泄漏时,内存碎片使问题进一步复杂化。

检查内存泄漏的最简单方法之一是启用 Delphi 内存管理器在该区域的功能。当 Delphi 采用 FastMM 内存管理器作为 Delphi 2006 的默认值时,这变得更容易了。然而,这个 FastMM 内存管理器(开源)也可以在早期显式且非常容易地用作替代内存管理器Delphi 版本。

如果您使用的是 Delphi 2006 或更高版本,可以在 the Delphi documentation 中找到有关使用新的默认内存管理器调试功能的一些入门信息。

为了在早期版本的 Delphi 中使用开源版本,网络上有许多博客文章,其中this is just one

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-17
    • 2010-11-06
    • 1970-01-01
    • 2011-03-29
    • 2012-07-16
    相关资源
    最近更新 更多