问题标签 [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.
delphi - 调用 FastMM4 LogAllocatedBlocksToFile() 是否会定期占用内存空间?
我正在寻找一个 Delphi 5 程序中难以捉摸的内存问题,其中内存在客户站点被随机覆盖。在尝试了很多到目前为止都没有结果的事情之后,我现在想使用 FastMM4 的输出LogAllocatedBlocksToFile()
来找出在被覆盖区域之前立即分配了哪些对象。该程序使用计时器每 30 分钟将分配的块信息写入一个新文件。不幸的是,我的程序测试运行(DEBUG 构建)在大约 23 小时后崩溃,EOutOfMemory
但根据 MadExcept 使用分配的 1.83 GB 内存。
从 SysInternals Process Explorer 看起来,每次调用都LogAllocatedBlocksToFile()
分配但不释放内存:
CPU 使用情况图中的红色尖峰是LogAllocatedBlocksToFile()
调用。我在LogMemoryManagerStateToFile()
之前和之后添加了调用,最后一个峰值的数据(私有字节从大约 183 MB 增加到大约 218 MB)如下所示:
55054K 分配
47911K 开销
53% 效率
和这个:
55055K 分配
47910K 开销
53% 效率
因此,根据 Process Explorer,FastMM4 似乎不知道程序消耗的额外内存。
我使用的是今天从 SourceForge 下载的 FastMM4 版本 4.991。测试程序在 DEBUG 模式下运行,具有以下定义集:
全调试模式
UseCustomFixedSizeMoveRoutines
UseCustomVariableSizeMoveRoutines
NoDebugInfo
ASMVersion
DetectMMOperationsAfterUninstall
RawStackTraces
LogErrorsToFile
LogMemoryLeakDetailToFile
AlwaysAllocateTopDown
SuppressFreeMemErrorsInsideException
EnableMemoryLeakReporting
HideExpectedLeaksRegisteredByPointer
RequireDebuggerPresenceForLeakReporting
EnableMMX
Use ForceMMX
EnableBackwardCompatibleMMSha
问题:
这些功能是否有任何已知问题?我是否没有正确使用它们,是否不打算在一个调试会话中多次调用它们?有没有办法再次释放该内存?
delphi - 这个内存泄漏的来源是什么(使用TCollection时)
我有一些我没有编写的代码,但是存在内存泄漏。真正奇怪的是,如果我在返回之前将结构归零,内存只会泄漏。
可重现的最小代码
在 Delphi 5 和 Delphi 7 中泄漏是可重现的。
首先我们有一个结构:
这个结构是CollectionItem
对象的私有成员:
然后我们拥有拥有的集合,它有一个可以返回填充结构的函数:
奇怪的是位于GetLocalFile
函数中:
实际上,这个函数被传递了一个流,并返回一个填充的结构,但现在这并不重要。
接下来我们有一个集合的方法,它将填充它的所有条目的LocalFile
结构:
最后,我们构建一个集合,向其中添加 10 个项目,拥有它们DoStuff
,然后释放列表:
我们创造了10 个项目,我们泄露了9 个 AnsiStrings
。
令人恐惧的令人困惑的事情
有一些方法可以使此代码不泄漏。它仅在使用中间字符串堆栈变量时泄漏
改变:
至
它不会泄漏。
另一种方法不在返回之前
删除对FillChar
or的调用ZeroMemory
,它不会泄漏:
这些都是奇怪的决议。无论我是否使用中间堆栈变量,无论我是否将结构归零,都不会对内存清理产生任何影响。
我怀疑这是编译器中的错误。这意味着我(意思是写这篇文章的人)正在做一些根本错误的事情。我认为这与TCollectionItemClass
。但我无法为我的生活弄清楚是什么。
完整代码
哦,别忘了添加FastMM4
到你的项目中(如果你还没有内置它),这样你就可以检测到泄漏。
delphi - FastMM4 中的偶尔访问冲突,DebugGetMem
我正在尝试追踪访问冲突。可重复性似乎是不确定的,而且很少见,所以我想在进一步讨论之前检查我的一些假设。
在 FastMM4 版本 4.991 的函数DebugGetMem
中,在以下代码中引发了访问冲突:
例外是:
Project Workstation.exe 引发异常类 $C0000005,并带有消息“0x01629099 处的访问冲突:读取地址 0x66aed8f8”。
调用堆栈通常是相同的。它是从我调用的虚拟树视图上的绘制事件中调用的,Format('%s %s %s', [vid, node, GetName()])
尽管我怀疑这是否真的相关(除了 Format 分配动态内存)。
我正在使用FullDebugMode
(显然)和CheckHeapForCorruption
选项。
我还建立了以下内容:
- 打开
CatchUseOfFreedInterfaces
并没有显示任何新内容。我仍然遇到相同的访问冲突,并且没有额外的诊断。 - 我曾经用 重现了崩溃
FullDebugModeScanMemoryPoolBeforeEveryOperation := True
,虽然我不记得CatchUseOfFreedInterfaces
这次是打开还是关闭。 - 这不是线程并发问题;我的应用程序是单线程的。(实际上,这并不完全正确。我正在使用 Virtual TreeView,它创建了一个隐藏的工作线程,但如果这确实是原因,那么错误在 Virtual TreeView,而不是我的代码中,这不太可能。)
我是否正确地认为,尽管CheckHeapForCorruption
没有捕获任何东西,但这个异常只能是由于我的代码破坏了堆?还有什么其他可能导致 FastMM4 以这种方式崩溃的吗?
对进一步诊断有什么建议,甚至使崩溃更具重现性?
delphi - 用于 Apache 的 Delphi 共享模块内存不足
我希望有人能对我遇到的问题有所了解。
我正在编写一个 Apache 共享对象模块,它充当我的应用程序的服务器。客户端或多个客户端向该模块发出 SOAP 请求,模块与数据库对话并将 SOAP 响应返回给客户端。任务管理器在任务管理器中使用大约 35000K 显示 httpd 进程(来自客户端的传入请求),但每隔一段时间,其中一个 httpd 进程的内存/CPU 使用率会增长,并且随着时间的推移达到 2GB 的上限,然后它会崩溃。在这种情况下,服务器报告“内部服务器 500”错误。(已添加截图)
我使用 FastMM 检查内存泄漏,它确实会生成日志,但没有报告内存泄漏。为了确保我正确使用 FastMM,我引入了内存泄漏,FastMM 将记录它。所以,我的假设是我没有内存泄漏,但是在达到 2GB 阈值之前内存会以某种方式被消耗,并且在我手动重新启动 Apache 之前不会释放。
然后我开始使用 FastMM 的 LogMemoryManagerStateToFile 调用拍摄快照,以便在调用时创建内存快照。LogMemoryManagerStateToFile 使用以下信息创建文件,但除了告诉我例如 8320 对 UnicodeString 的调用分配了 676512 字节之外,我不明白它对我有什么帮助。
其中哪些没有正确发布?请注意,此信息是创建文件的缩短版本,仅用于一个方法调用。不同的方法可能会发生许多调用:
就在代码中定位和修复内存而言,这些数据如何有助于确定内存在哪里消耗如此之多?
非常感激,
delphi - FastMM 和隐式 dll 延迟
我将 delphi XE2 与 FastMM4 一起使用。当我想使用关键字“延迟”创建 DLL 时,我在离开应用程序时违反了规定。如果我在没有“延迟”的情况下进行测试,则可以在没有违规的情况下离开应用程序
主要代码:
DLL代码:
FastMM 中是否存在参数?
delphi - 为什么 is 运算符在传递来自不同模块的实例时无法返回我期望的结果?
我从事与许多其他小型库交互的 Delphi 项目。我使用 FastMM4,我想处理通过 dll 参数传递的复杂类。
例如,我将表单发送到我的 dll。在 dll 中,我使用运算符“IS”测试参数的类型。
但是进入 Dll 的操作符“IS”总是返回“false”
示例
和电话
c++ - 使用 Indy TIdTCPServer 的 Windows 服务 (CodeGear C++ XE5) 中的内存泄漏
我有 CodeGear C++ Builder XE5。使用 TIdTCPServer 创建的服务器,效果很好。但是服务使用的内存正在增长。我终于设法包含了完整版的 FastMM4 内存管理器,在摆弄选项后,我发现内存泄漏的确认:
显然 x1 和 x2 不关心我,但是 x21 泄漏很糟糕,因为这是一个高度使用的服务 - 每个连接流血 100 和 164 字节:
更多详细信息指出:
在这一点上我被卡住了,我不知道这是为了什么,因为我不直接调用 Zip_int。谁能指出我正确的方向?
delphi - ShareMM 中的 FastMM LogAllocatedBlocksToFile
我有一堆动态加载另一堆 DLL 的 EXE,其中大部分都暴露了 COM 对象。
现在我正在尝试使用其中一个 EXE 来调试其中一个 DLL。
所有项目都使用最新的 FastMM4 (4.991) 和 ShareMM 等在完全调试模式下编译。
有一个例程具有一些奇怪的对象创建/分配/破坏行为,所以我想记录那些以捕获由它破坏的对象,这些对象不是由它创建的。
我使用 SetMMLogFileName('before') 和 LogAllocatedBlocksToFile(0, 0); 在例程开始工作之前对存在的任何内容进行快照。
然后执行 PushALlocationGroup(1) 并在例程完成后执行与上述类似的调用。
问题是,没有任何记录。这是有道理的,因为例程在 DLL 中执行,主 MM 由 EXE 初始化(已经在调试中确认了这一点)。
所以基本上我需要让 FastMM 中的日志分配块例程共享感知。我查看了代码,但我似乎无法弄清楚如何做到这一点。
有人已经这样做了,或者有一些建议让我开始吗?
谢谢。
delphi - FastMM NeverSleepOnThreadContention
INC 文件中的文档非常害怕这个选项。
那么,如果我在 FastMM 中激活 NeverSleepOnThreadContention 和 UseSwitchToThread 选项,在什么情况下可以获得性能?我是否也应该为经典(非多线程)Delphi 应用程序激活它们?
或者,换句话说,我不应该在哪里激活这个选项?
delphi - 如何在 XE7 C++ Builder 上为 FireMonkey 项目使用 FastMM?
我正在尝试在 XE7 C++ 构建器中使用 FastMM 完整调试模式,特别是对于 FireMonkey。我下载了源代码并按照“FastMM4BCB.cpp”中的步骤概述。为了让 FastMM 编译,我做了以下更改:
- 注释掉'FastMM4BCB.cpp'中的第63行,即: #pragma option -k- -d -vi- -O2 -b- -3 -a8 -pc -RT- -x -xd -r -AT -vG- -vG0- -vG1- -vG2- -vG3- -vGc- -vGt- -vGd-
- 在我的项目文件中,添加一行: #pragma link "FastMM4BCB" 而不是(如 'FastMM4BCB.cpp' 中所述)USEOBJ("FastMM4BCB.cpp")
通过这些更改,FastMM 编译并成功运行。但是,即使是空白项目(我尝试了 FireMonkey 和 VCL),它也会报告内存泄漏,如下所示:
- 13-20 字节:未知 x 8
- 61-68 字节:未知 x 1
- 189 - 204 字节:未知 x 1
通过 VCL 项目,我能够使用完整的调试模式并获得有关这些内存泄漏的一些详细信息(例如):
对于空白的 FireMonkey 项目,当应用程序以 FastMM 标记的地址 0x80 模式关闭时,它会引发(在完全调试模式下)访问冲突错误。知道如何使它适用于 FireMonkey 并在空白项目中删除这些误报吗?谢谢