如果没有 valgrind 等内存泄漏检测工具的支持,我们如何得出进程中存在内存泄漏的结论?

如果没有 valgrind 等内存泄漏检测工具的支持,我们如何得出进程中存在内存泄漏的结论?

如果进程的RSS值(通过top或ps命令获得)快速增加,可以将其视为内存泄漏。假设修改代码的规定较少,并且没有足够的支持来安装新的实用程序来跟踪内存使用情况。

由于它是专有应用程序,我无法在这里提供代码。我已经缩小了问题范围。客户端和服务器守护程序之间打开和关闭的每个 openSSL 连接都会引入一些内存泄漏。服务器守护进程是一个典型的服务器,它不断等待连接,一旦连接被接受,它就会创建一个线程来处理客户端请求。 openSSL1.0.1是版本。根据链接:https://stackoverflow.com/questions/29845527/how-to-properly-uninitialize-openssl

由于我对服务器端感兴趣,因此将以下清理添加到服务器类析构函数中。

void ServerClass::doCleanUp()
{
    CRYPTO_cleanup_all_ex_data();
    ERR_free_strings();
    ERR_remove_state(0);
    ERR_remove_thread_state(NULL);
    CRYPTO_set_locking_callback(NULL);
    CRYPTO_set_id_callback(NULL);
}

在对不同迭代执行连接打开和关闭测试之后,RSS值存在一些差异,即(RSS_value_after_test_completion - RSS_value_at_startup)为正。那么这个+ve差异可以被视为内存泄漏吗?同样,根据 stackoverflow 链接,存在应用程序级清理和线程级清理的概念。在我之前的解决方案中,我使用了 EVP_cleanup(),它在其他测试用例中产生了问题,所以同样的情况已被恢复。我无法执行卸载 DH 参数相关的活动,因为服务器应该始终处于运行状态。我错过了什么吗?进一步的指导将不胜感激。

一些观察:观察 1:当我执行 5、10、30 和 60 次迭代的打开和关闭测试时,我观察到一旦进程的 RSS 值达到某个值(37.7MB),它就不会从该值增加。注意:- 测试迭代顺序可能与提到的不同。
观察 2:通过一次打开和关闭测试迭代,我可以看到 RSS 值增加了大约 7 MB。观察 3:测试人员正在针对特定迭代(例如 100)执行测试,因此 RSS 值始终存在 +ve 差异,并声称存在泄漏。

答案1

不必要:

  • 您的应用程序可能正在维护一个内存数据库,它会定期检查并删除过时的项目
  • 应用程序(例如 Java)可能会定期进行垃圾收集。

即使它碰巧耗尽了内存,也可能只是配置错误(无法达到定期检查/清理状态)。

相关内容