ruby中本地变量和实例变量之间的差异

时间:2011-01-13 22:39:20

标签: ruby

我正在开发一个脚本,它创建了几个相当复杂的嵌套哈希数据结构,然后有条理地创建数据库记录。这是一个使用活动记录的独立脚本。运行几分钟后,我发现服务器响应速度明显滞后,并发现该脚本在设置为nice +19时,正在享受稳定的%85 - %90总服务器内存。

在这种情况下,我只是为了可读性而使用实例变量。它有助于了解在循环之外将重复使用的内容与不会重复使用的内容。是否有理由在不需要时不使用实例变量?本地变量和实例变量之间的内存分配和管理是否存在差异?如果不再需要@variable = nil,它会有帮助吗?

2 个答案:

答案 0 :(得分:5)

实例变量在持有它的对象的生命周期中继续存在。局部变量仅存在于单个方法,块或模块体中。

如果您假设对象的实例中的对象将被垃圾收集,因为您不打算将来引用它们,那不是它的工作方式。垃圾收集器只知道是否存在对该对象的可访问引用 - 并且它是否存在于实例变量中。

答案 1 :(得分:2)

设置 @variable = nil 会破坏对实例变量曾指向的对象的引用。当没有剩余的对象引用时,最终应由垃圾收集器收集。我说“最终”因为GC有些不可预测。但是,通过“悬空引用”并且可能(取决于GC的实现方式)循环引用很容易导致内存泄漏。还有什么指的是这个对象?