跟踪大型代码库中的内存泄漏


Tracking memory leaks in a large codebase

我有一个相对较大的PHP代码库(数千行),用于使用CodeIgniter构建的应用程序。为了能够跟踪性能问题并能够生成统计信息等,开发服务器运行 Xhprof。这工作正常,前提是脚本实际进入日志记录部分。

但是,我现在遇到了脚本超时的情况。在开发服务器上,它只是给出超时("找不到服务器")错误,有时甚至会使Apache进程崩溃。不会生成 Xhprof 文件,CodeIgniter 日志记录系统不会生成任何内容。错误报告已消除。

在实时环境(即实时服务器的镜像)上,应用程序实际上会生成一个错误:

致命错误:第 493 行的/home/www/application/system/database/drivers/mysql/mysql_driver.php 中允许的 33554432 字节内存大小已耗尽(尝试分配 261900 字节

这一点,以及对如何重现错误的线索,让我有点预感从哪里开始纠缠解决方案。但这是一项耗时的工作。

我正在寻找一种方法来跟踪实际"内存泄漏"发生的位置。而不是一行又一行地手动调试。任何建议将不胜感激。

更新 :服务器的内存不足不是问题。在具有更多内存的开发服务器上,会出现相同的问题。问题是无限循环,分配的内存比我的服务器可以处理的内存多。问题仍然存在:如何快速追踪这些错误?

使用 xdebug。与 xhprof 相反,使用 xdebug 进行分析会在脚本运行时生成输出,这意味着即使脚本挂起或超时,您也可以剖析到该点生成的跟踪。

另请参阅使用 xdebug 进行性能分析以开始使用。

打算保留统计信息的程序的一个常见问题是,保留指针指向它们接触的所有内容,这会阻止内存管理回收它们。 如果不是这种情况,这可能不是泄漏,它可能只是一个失控的分配。 您可能只有几个地方可以这样做。 一个好的开始是替换对系统函数的直接调用使用您自己的函数分配内存块,然后检测这些函数,查看对于意外的大型阵列分配。

按照现代标准,引用的限制(32mb)并不是很大。 很容易出现没有任何问题的情况,除了该过程具有不合理的低限制。