循环中的红宝石代码内存泄漏



下面的代码有内存泄漏。它在Ruby 2.1.1下运行。我找不到实际泄漏。

q = Queue.new("test")
while true do
  m = q.dequeue
  body = JSON.parse(m.body)
  user_id = body["Records"][0]
  user = V2::User.find(user_id)
  post = V2::Post.find(post_id)  
end

经过几个小时的运行,我添加了gc.start,但没有解决问题

q = Queue.new("test")
while true do
  m = q.dequeue
  body = JSON.parse(m.body)
  user_id = body["Records"][0]
  user = V2::User.find(user_id)
  post = V2::Post.find(post_id) 
  GC.start 
end

我不知道如何找到实际的内存泄漏。

尝试从底部删除线条,并查看内存泄漏是否持续。内存泄漏可能来自查找方法,也可能来自JSON.PARSE(极不可能)或自定义队列数据结构。如果内存泄漏仍在删除所有线路后仍然存在,则可能来自工人本身和/或运行工人的程序。

q = Queue.new("test")
while true do
  m = q.dequeue # Finally remove this and stub the while true with a sleep or something
  body = JSON.parse(m.body) # Then remove these two lines
  user_id = body["Records"][0]
  user = V2::User.find(user_id) # Remove the bottom two lines first
  post = V2::Post.find(post_id)
end

我敢打赌,问题是引入局部变量(SIC!)。摆脱user_idpost_id,它可能会停止泄漏:

# user_id = body["Records"][0]
# user = V2::User.find(user_id)
user = V2::User.find(body["Records"][0]) # sic!

原因是Ruby如何将对象存储在rvalues中。

最新更新