问题标签 [fastmm]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
4 回答
6897 浏览

delphi - 为什么我的 Delphi 程序的内存不断增长?

我使用的是 Delphi 2009,它内置了 FastMM4 内存管理器。

我的程序读入并处理一个大型数据集。每当我清除数据集或退出程序时,所有内存都会正确释放。它根本没有内存泄漏。

使用 spenwarr 的回答中给出的 CurrentMemoryUsage 例程:如何获取 Delphi 程序使用的内存,我已经显示了 FastMM4 在处理过程中使用的内存。

似乎正在发生的事情是,在每个进程和释放周期之后,内存使用量都在增长。例如:

在没有数据集的情况下启动我的程序后使用了 1,456 KB。

加载大型数据集后使用了 218,455 KB。

完全清除数据集后的 71,994 KB。如果我此时退出(或我的示例中的任何一点),则不会报告内存泄漏。

再次加载相同的数据集后使用了 271,905 KB。

完全清除数据集后 125,443 KB。

再次加载相同的数据集后使用了 325,519 KB。

完全清除数据集后 179,059 KB。

再次加载相同的数据集后使用了 378,752 KB。

似乎我的程序的内存使用在每个加载/清除周期增加了大约 53,400 KB。任务管理器确认这确实发生了。

我听说 FastMM4 并不总是在释放对象时将所有程序内存释放回操作系统,以便在需要更多内存时保留一些内存。但是这种持续的增长让我很困扰。由于没有报告内存泄漏,我无法确定问题。

有谁知道为什么会发生这种情况,如果它是坏的,如果有什么我可以或应该做的吗?


感谢 dthorpe 和 Mason 的回答。你让我思考和尝试让我意识到我错过了什么的事情。所以需要详细的调试。

事实证明,我所有的结构在退出时都得到了适当的释放。但是在运行期间每个循环后的内存释放不是。它正在累积内存块,如果我的退出清理不正确,通常会导致在退出时可以检测到的泄漏 - 但确实如此。

我需要在周期之间清除一些 StringLists 和其他结构。我仍然不确定我的程序如何正确处理早期周期中仍然存在的额外数据,但确实如此。我可能会进一步研究。

这个问题已经回答了。谢谢你的帮助。

0 投票
6 回答
4566 浏览

delphi - FastMM 和动态加载的 DLL

我有一个主机应用程序,它在启动时加载了十几个库。我想从 Delphi 7s 默认内存管理器切换到 FastMM4 的完整版本,以获得更好的内存泄漏报告。

我应该在主机应用程序和库的使用部分中包含 FastMM4 吗?共享运行时包呢?


一些补充信息:

  • 我们有一个 exe 和 >20 个 dll。每个人都在共享一个运行时包。
  • 我们今天不使用 sharemem。不是我知道的。ShareMem 不包含在我今天快速浏览的 exe 或 dll 中。

附加问题:

  • 我可以在所有项目的 fastmems inc 文件中使用相同的选项,还是 exe 和 dll 需要不同的设置?
0 投票
4 回答
1563 浏览

delphi - 与其他编程语言兼容的 Delphi DLL

我想构建一个导出返回字符串的函数的 DLL。这个 DLL 应该可以与其他编程语言一起使用!!我已经找到了各种讨厌的解决方案/黑客,最好的一个是让我的函数返回 Pchar,然后调用包含在同一个 DLL 中的另一个函数(我们称之为 ReleaseMemory)来释放为 PChar 保留的内存。

无论如何,最近我发现了 FastShareMem 库。它说它可以做我想做的事,而无需调用 ReleaseMemory。另一方面,FastMM 似乎与 LONG 一样,因为 DLL 和应用程序都使用 FastMM 作为内存管理器。这立即扼杀了使用 FastMM 作为我的通用 DLL 的内存管理器的机会。对?

=====================

FastShareMem ( http://www.codexterity.com/fastsharemem.htm)、Delphi 7、Windows XP 32 位、Windows 7 64 位

0 投票
2 回答
362 浏览

delphi - 为什么我在嵌入式 Windows XP 下运行的 Delphi 2006 应用程序出现内存错误

我有一个使用 FastMM4 的 D2006 应用程序(例如,它在 DPR 文件的 uses 子句的开头有“FastMM4”)。我知道 Delphi 无论如何都使用 FastMM4 作为它的内存管理器,但是下载的版本有更多的调试转储选项。

我最近尝试在运行 Windows XP Embedded 的单板平板型工业 PC 上运行该应用程序。该处理器是非英特尔“Vortex”芯片。该应用程序在启动时因内存错误而失败,然后退出并出现 FastMM4 关于在释放内存后访问内存的投诉。

从源代码中删除 FastMM4 的所有痕迹似乎可以治愈它 - 应用程序运行良好。

我的问题。导致此问题的 FastMM4 的下载版本是什么?我见过一些关于 FastMM4 和非 Intel 处理器崩溃的轶事,似乎与使用 ASM 代码有关。FastMM4 包含一个强制生成非 ASM 代码的指令,但这并不能解决问题。

我有点担心集成 D2006 版本的 FastMM4 可能仍然存在问题,但我还没有看到。

0 投票
5 回答
2969 浏览

delphi - Delphi 自动垃圾收集器

是否有可能认为将来在 Delphi 中有一个自动垃圾收集器?在许多应用程序中,对何时释放对象的高度详细控制并不那么重要,它只是一件额外需要关心的事情。

对于这样的应用程序,拥有一种像 java 那样工作的垃圾收集器会很有趣。

可以在项目选项中设置。

这可能吗?

注意:我并不是说像这里解释的那样手动创建它,我真正的意思是 Delphi 功能。

换一种说法:是否可以将 FastMM 设置为垃圾收集器?

0 投票
1 回答
1329 浏览

delphi - 将 FullDebugMode 用于 FastMM 时在 IDE 中运行失败

我正在尝试使用FullDebugMode(fastmm4) 来详细报告内存泄漏。

虽然我可以在一个创建但不释放的虚拟应用程序中成功完成这项工作,但TStringList我不能在另一个应用程序中。

在这两个项目中,dpr 都是这样的:

FullDebugMode在 Fasttmm inc 选项文件中启用了。

在两个项目的项目选项中,我将以下设置设置为 True:

在编译选项卡中:

**发出运行时类型信息

使用调试 dcus**

在链接选项卡中:

调试信息

这些设置适用于虚拟应用程序,但对于真正的应用程序,在链接后我可以看到 IDE 事件日志窗口填充,之后

模块加载:SHLWAPI.dll。没有调试信息。基地址等...

程序立即重置(就像我做了 CTRL-F2 一样)

你有什么想法?

0 投票
3 回答
630 浏览

delphi - Delphi:FastMM 让你的可执行文件更大?

FastMM 是否使您的可执行文件更大?我注意到我的应用程序增长了大约 300-500kb,这对我来说相当大。我已经关闭了 delphi 编译器选项以排除调试信息,但大小没有改变。

我使用 FastMM 的 FullDebugMode 打开,这会影响大小吗?但是当我尝试关闭它时,它会寻找我找不到的 libc。

请帮忙...我正在使用D5

0 投票
2 回答
2100 浏览

delphi - 如何在 Delphi 6 包中使用 FastMM4?

我一直在我的 Delphi 6 Pro 应用程序中顺利使用 FastMM4 4.92 版。我现在想在我创建的包 (BPL) 中使用它。我尝试将这些单元放在包含部分中,然后将它们移动到列表的顶部,但我仍然收到来自 FastMM4 的错误,抱怨它不是第一个要初始化的单元。为了解决这个问题,我想将 FastMM4 放在 Requires 部分,但我在任何地方都找不到 FastMM4 的 DCP 文件(运行时库)。有谁知道如何做到这一点?

0 投票
1 回答
1259 浏览

delphi - 如何在这段代码中释放 TOleStream

这是来自在 Delphi 中完成的自定义命名空间处理程序,我用来将文件加载到 webbrowser 组件中。

问题是 Fastmm4 在程序结束时会出现内存泄漏错误,并说 TOleStream 没有被释放。我如何释放它?如果我将 TOleStream 放在一个变量中并像这样分配

最后,当我释放 TOS 变量时,我得到一个错误(EAccessViolation 指向 ComObj 中的 TComObject.ObjRelease)。我会很感激你的意见和帮助。这个问题已经困扰我一段时间了。

我也想知道它是否可能与 FastMM4 相关?会不会是提供虚假信息?在下面的一些代码中。TOLEStream 通常是如何释放的?

有没有办法在不使用 TFileStream 的情况下将数据发送到数据流?

嗨 Remy,您可以在此处找到带有 fastmm 和问题过程的命名空间处理程序的工作演示项目:http://mode5.webs.com/namespace.7z 项目加载时,单击按钮以加载命名空间处理程序文件。当你退出时,你应该得到 fastmm 错误。亲切的问候,

0 投票
4 回答
3624 浏览

delphi - 如何说服内存管理器释放未使用的内存

在最近的一篇文章中(我的程序从不释放内存。为什么?)我展示了在使用 FastMM 时,应用程序不会将大量内存释放回系统。最近我创建了一个人工测试程序,以确保它不是内存问题,并且它只出现在 FastMM 中。

在这个程序中,我创建和销毁一个对象(与上一篇文章中使用的对象相同)500 次。

内存要求是(“私人工作集”):

没有 FastMM
运行循环前:1.2MB
运行循环后:2.1MB

使用 FastMM(积极调试模式)
运行循环前:2.1MB
运行循环后:25MB

使用 FastMM(释放模式)
运行循环前:1.8MB
运行循环后:3MB

如果我多次运行循环,内存需求不会增加。这意味着未释放的内存被重新使用,因此这不是内存泄漏(内存泄漏会增加内存占用,每次运行时会增加几个 KB/MB)。


我的问题是:

如何在 FastMM 中禁用此行为?甚至可能吗?我知道,如果我在没有 FastMM 或 FastMM 发布模式的情况下发布程序,它将“浪费”适量的 RAM。但是按需禁用此行为将帮助我(我们?)识别内存泄漏。实际上,在我的第一篇文章(见链接)中,很多人认为我有泄密。显然,正是因为这种行为,才造成了混乱。不,很明显没有泄漏。只是内存管理器拒绝释放大量内存。

它会释放额外的内存吗?什么时候?是什么触发了这个?程序员可以触发吗?例如,当我知道我已经完成了一项 RAM 密集型任务并且用户可能暂时不使用该程序(最小化它)时,我可以将 RAM 刷新回系统吗?当用户打开我的程序的多个实例时会发生什么?他们不会争夺内存吗?