这会在Rails中引起任何内存泄漏吗?

时间:2018-10-11 21:05:12

标签: ruby-on-rails ruby hash memory-leaks

我在这个问题上停留了很长时间。

我想创建一个嵌套的哈希。以前我曾经这样做:

a = {}

a[x_id] ||= {}
a[x_id][y_id] || = {}
a[x_id][y_id] = z_value

然后我来到stackoverflow,发现了这个灵魂:

a = Hash.new {|h,k| h[k] = Hash.new(&h.default_proc) } #highlighted line
a[x_id][y_id] = z_value

现在,我不明白“突出显示的线”。但是当我实现它时,它就起作用了。

现在,问题是,在更多的数据或更多的嵌套的情况下,这将如何导致更重要的内存泄漏?

谢谢。

1 个答案:

答案 0 :(得分:1)

我认为您对内存泄漏有一个误解,或者至少是它如何适用于Ruby(或更准确地说,如何应用)。

Ruby使用垃圾回收器,当对象超出范围时(即不再有对其的现有引用),该垃圾回收器会为您处理释放内存。除非您像在C语言中那样自己分配内存,否则不必担心释放内存。

在Ruby中,除非您使用C API,使用Fiddle / FFI调用外部代码(在某些情况下)或其他一些极端情况,否则您不必担心释放内存。简单地让一个对象超出范围将在内部完成相同的任务。

假设您可能使用的术语不准确,并且实际上意味着“存储越来越多的毫无价值的对象,这些对象将不会再次使用”,那么这就是您的示例不清楚的实现问题。

例如,如果您的意思是...

hash[x][y] = z

...然后,您执行相同的操作,想知道旧的z值是否正在建立内存,然后是“ no”,而不是(假设xy是相同的)。如上所述,将新值存储到同一位置会导致原来的旧对象超出范围,并且Ruby将在内部释放其内存,只要未在其他任何地方引用它即可。