我正在开发一个脚本,它创建了几个相当复杂的嵌套哈希数据结构,然后有条理地创建数据库记录。这是一个使用活动记录的独立脚本。运行几分钟后,我发现服务器响应速度明显滞后,并发现该脚本在设置为nice +19
时,正在享受稳定的%85 - %90总服务器内存。
在这种情况下,我只是为了可读性而使用实例变量。它有助于了解在循环之外将重复使用的内容与不会重复使用的内容。是否有理由在不需要时不使用实例变量?本地变量和实例变量之间的内存分配和管理是否存在差异?如果不再需要@variable = nil
,它会有帮助吗?
答案 0 :(得分:5)
实例变量在持有它的对象的生命周期中继续存在。局部变量仅存在于单个方法,块或模块体中。
如果您假设对象的实例中的对象将被垃圾收集,因为您不打算将来引用它们,那不是它的工作方式。垃圾收集器只知道是否存在对该对象的可访问引用 - 并且它是否存在于实例变量中。
答案 1 :(得分:2)
设置 @variable = nil 会破坏对实例变量曾指向的对象的引用。当没有剩余的对象引用时,最终应由垃圾收集器收集。我说“最终”因为GC有些不可预测。但是,通过“悬空引用”并且可能(取决于GC的实现方式)循环引用很容易导致内存泄漏。还有什么指的是这个对象?