gpt4 book ai didi

ruby - 在非常复杂的 Ruby 应用程序中查找内存泄漏

转载 作者:数据小太阳 更新时间:2023-10-29 07:54:04 26 4
gpt4 key购买 nike

大家好!

使用 Ruby 并编写一些代码真是太好了。但是在过去的一周里,我注意到我们的应用程序存在一些问题。内存使用量像 O(x*3) 函数一样增长。

我们的应用程序非常复杂,它基于 EventMachine 和其他外部库。更重要的是,它使用 Ruby 1.8.7-p382 在 amd64 位版本的 FreeBSD 下运行

我尝试自己研究如何在我们的应用程序中发现内存泄漏。我找到了许多工具和库,但它们在 FreeBSD'64bit 下不起作用,而且我不知道如何加紧查找大型 ruby​​ 应用程序中的漏洞。没关系,如果您的文件只有几个 200-300 行代码,但在这里您有大约 30 个文件,平均有 200-300 行代码。

我刚刚意识到,我需要太多时间来发现这些漏洞,做一些愚蠢的行为:相信/研究/假设这段代码的某些部分可能实际上正在泄漏并包装一些跟踪代码,比如使用 ruby​​-prof gem 技术。但这是一种非常缓慢的方式,因为正如我所说,我们的代码太多了。

所以,我的问题是如何在非常复杂的 Ruby 应用程序中发现内存泄漏,而不是将我的全部生命都投入到这项工作中?

提前致谢

最佳答案

尝试的一件事是通过每隔一段时间调用 GC.start 手动触发垃圾收集器,即使它会大大降低性能。多久一次是主观的,因为你运行它的次数越多,应用程序就越慢,而你运行它的次数越少,内存占用就越高。

无论出于何种原因,垃圾收集器可能会不时休假,如果正在进行一些繁重的处理,大概不想干涉。因此,您可能需要手动调用以将垃圾带走。

避免产生垃圾的一种方法是更有效地使用内存。当数组可以完成工作时不要创建散列,当单个字符串就足够时不要创建数组,等等。重要的是要分析您的应用程序,以便在您开始随机破解之前查看哪些类型的对象使您的堆变得困惑。

如果可以,请尝试使用 1.9.2,它在内存管理方面取得了显着进步。如果您需要 1.8.7 兼容性,Ruby 企业版也是一个选项,因为它本质上是该版本更好的垃圾收集器。

关于ruby - 在非常复杂的 Ruby 应用程序中查找内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7419651/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com