Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在LinuxC/c++;程序 我想预测Linux C++程序中的内存泄漏。_C++_C_Linux_Algorithm_Memory Leaks - Fatal编程技术网

如何在LinuxC/c++;程序 我想预测Linux C++程序中的内存泄漏。

如何在LinuxC/c++;程序 我想预测Linux C++程序中的内存泄漏。,c++,c,linux,algorithm,memory-leaks,C++,C,Linux,Algorithm,Memory Leaks,该程序是一个网络服务器,它分叉许多子进程来处理请求 我可以在进程处理一个请求后获得进程的RSS,如果进程发现可能存在内存泄漏,我想让它自杀 如果RSS大于配置值(比如1GB),我可以让进程自行终止,但这似乎太简单了,而且这个值也不容易配置 如果RSS越来越大达N倍(比如100倍),我也可以让进程自杀,但如果进程缓存一些数据,这似乎也不合适 是否有内存泄漏预测算法 我在谷歌上搜索过,但找不到 谢谢 对不起,没有把问题说清楚 事实上,我并不是想找到一些方法来找出内存是如何泄漏的,我知道有像valg

该程序是一个网络服务器,它分叉许多子进程来处理请求

我可以在进程处理一个请求后获得进程的RSS,如果进程发现可能存在内存泄漏,我想让它自杀

如果RSS大于配置值(比如1GB),我可以让进程自行终止,但这似乎太简单了,而且这个值也不容易配置

如果RSS越来越大达N倍(比如100倍),我也可以让进程自杀,但如果进程缓存一些数据,这似乎也不合适

是否有内存泄漏预测算法

我在谷歌上搜索过,但找不到

谢谢


对不起,没有把问题说清楚

事实上,我并不是想找到一些方法来找出内存是如何泄漏的,我知道有像valgrind这样的工具

情况是这样的:

我编写的程序是一个RPC框架,有一个父进程,它将分叉许多子进程

这些子流程将运行一些不是我编写的业务逻辑代码,我无法控制这些代码

当这些逻辑代码泄漏内存时,子进程将被os OOM Killer杀死

但到那时,由于内存不足,操作系统将暂停一段时间(分钟甚至更长),甚至崩溃,我们将不得不重新启动系统

我希望通过预测逻辑代码的内存泄漏来避免这种情况,并使子进程在OOM kill完成其工作之前自行终止

如果子进程自杀,父进程将派生另一个子进程来运行逻辑代码

在子进程处理一个请求后,我可以得到子进程占用的内存

因此,最简单的方法是检查子进程是否比预先配置的值(如1GB)占用太多内存,如果是,则使其自行终止

但该算法似乎过于简单,且值不易配置

所以我发现了一个算法,可以预测进程中是否存在内存泄漏

多亏了您无法预测内存泄漏(它可能被证明相当于内存泄漏)

您可以测量或检测二进制文件,尤其是使用(它只会告诉您是否有特定的执行泄漏)


<>你也可以考虑使用。它通常会自动释放内存(但由于它是保守的,所以无法保证!)。

没有进一步的限制,没有。这个程序可以做任何事情,因此在它的内存使用中有什么样的模式。像这样的工具可以检测内存泄漏,例如通过跟踪每个内存分配并注意何时有无法访问的已分配内存。但他们实际上是在虚拟机或调试器下运行程序,这会造成巨大的性能损失,因此无法解决生产中使用内存泄漏检测的问题

解决方案是不泄漏内存,在开发软件的同时发现内存泄漏。在那里,您可以使用类似的工具,并结合足够的测试用例来捕获所有泄漏。但最好是做高质量的软件。内存泄漏要么是由于方法不当,要么是由于实现不及时


作为问题本身的实际解决方案:不要试图检测内存泄漏。只需重新启动流程,例如每24小时一次,在中断最少的时间重启。当然,这有点“丑陋”,例如,它鼓励在应该修复某些bug时忽略它们。这是一个“丑陋的现实与健全的工程原理”的案例

我想预测Linux C++程序中的内存泄漏。[…]是否有内存泄漏预测算法

不,没有算法。这取决于开发者的好习惯或坏习惯。这意味着,如果您编写了10个应用程序,并且它们都存在内存泄漏,那么您可以预测您的第11个应用程序将存在内存泄漏(即,您的应用程序不存在内存泄漏的几率为1/11)

在我看来,这就像x-y问题。如果您有内存泄漏的子进程,正确的解决方案是从子进程中删除内存泄漏。否则,您可以在系统中施加限制(即,没有子进程将消耗超过350Mb的内存)。但此限制与内存泄漏无关


< >检测开发过程中的内存泄漏,考虑使用专门工具(如ValgRink或BoundsChecker).

处理内存泄漏的一种方法是实现引用计数。其思想是,当计数下降到0时,每个对象或结构都有一个指针指向它的计数,以释放分配的内存。这迫使您重新思考代码,但当多个对象指向另一个对象且无法恢复时,这是有效的当它将变得无用时颁布法令

如果你在C++中编程,你可以试试Boost库,它们有实现指针引用的智能指针。


预测:当C++程序接近完成时,内存泄漏的概率接近1。最好的方法是防止内存泄漏,而不是预测。如果进程会自行死亡,那么有什么意义?如果内存不足,它(最有可能)会发生。崩溃,不管怎样。或者,你说的是其他事情,而不是真正的内存泄漏。并非所有内存泄漏的可能重复都是必要的。盲目杀死应用程序弊大于利。仅供参考,C++11也有可用的智能指针,此时它们可能是更好的选择(对于可移植性等)如果你写了10个应用程序,它们都有内存泄漏,你可以预测你的第11个应用程序会有内存泄漏:-D