0

我希望有人能对我遇到的问题有所了解。

我正在编写一个 Apache 共享对象模块,它充当我的应用程序的服务器。客户端或多个客户端向该模块发出 SOAP 请求,模块与数据库对话并将 SOAP 响应返回给客户端。任务管理器在任务管理器中使用大约 35000K 显示 httpd 进程(来自客户端的传入请求),但每隔一段时间,其中一个 httpd 进程的内存/CPU 使用率会增长,并且随着时间的推移达到 2GB 的上限,然后它会崩溃。在这种情况下,服务器报告“内部服务器 500”错误。(已添加截图)

在此处输入图像描述

我使用 FastMM 检查内存泄漏,它确实会生成日志,但没有报告内存泄漏。为了确保我正确使用 FastMM,我引入了内存泄漏,FastMM 将记录它。所以,我的假设是我没有内存泄漏,但是在达到 2GB 阈值之前内存会以某种方式被消耗,并且在我手动重新启动 Apache 之前不会释放。

然后我开始使用 FastMM 的 LogMemoryManagerStateToFile 调用拍摄快照,以便在调用时创建内存快照。LogMemoryManagerStateToFile 使用以下信息创建文件,但除了告诉我例如 8320 对 UnicodeString 的调用分配了 676512 字节之外,我不明白它对我有什么帮助。
其中哪些没有正确发布?请注意,此信息是创建文件的缩短版本,仅用于一个方法调用。不同的方法可能会发生许多调用:

FastMM State Capture:
---------------------

1793K Allocated
7165K Overhead
20% Efficiency

Usage Detail:
676512 bytes: UnicodeString x 8320
152576 bytes: TTMQuery x 256
144312 bytes: TParam x 1718
134100 bytes: TDBQuery x 225
107444 bytes: Unknown x 1439
88368 bytes: TSDStringList x 1052
82320 bytes: TStringList x 980
80000 bytes: TList x 4000
53640 bytes: TTMStoredProc x 90
47964 bytes: TFieldList x 571
47964 bytes: TFieldDefList x 571
41112 bytes: TFields x 1142
38828 bytes: TFieldDefs x 571
20664 bytes: TParams x 574
...
...
...
4 bytes: TChunktIME x 1
4 bytes: TChunkpHYs x 1
4 bytes: TChunkgAMA x 1

Additional Information:
-----------------------
Finalizing MyMethodName

就在代码中定位和修复内存而言,这些数据如何有助于确定内存在哪里消耗如此之多?

非常感激,

4

0 回答 0