2016-06-22 7 views
1

以下にコードがメモリリークしています。それはruby 2.1.1の下で動作しています。私は実際の漏れを見つけることができません。ランの数時間後ループ内のRubyコードのメモリリーク

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 

問題を解決しませ私は、実際のメモリリークを見つける方法がわかりません。

+3

「キュー」はどのように定義されていますか? 'Queue#dequeue'はどのように見えますか(私は' dequeue'がRubyに付属の 'Queue'に定義されていないことに気付きました)?キューにオブジェクトをエンキューするのは誰ですか?待ち行列には平均でいくつのオブジェクトがありますか? – spickermann

+0

あなたの質問に答えましたか? – Dbz

答えて

1

下から行を削除し、メモリリークが続くかどうかを確認してください。メモリリークがfindメソッドか、おそらくJSON.parse(非常にありそうもない)またはカスタムのQueueデータ構造から来ている可能性があります。すべての行を削除した後にメモリリークが残っている場合は、ワーカー自身および/またはワーカーを実行しているプログラムから来ている可能性があります。

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 
+0

一見して私は同じことを考えていました。そのループは高いCPU使用率につながりますが、なぜメモリ使用量が高くなるのでしょうか? – spickermann

+0

@Dbz実際にその労働者。毎秒実行されます。待ち行列をListonします。任意のメッセージがキューにプッシュされると、メッセージをキューから取り出してジョブを実行します。 – SaravanaKumAr

+0

はい。あなたたちは間違いなく正しいです。私はデバッグのヒントで私の答えを更新しました。これを試してから結果を投稿してください。 – Dbz

0

私は問題が導入されたローカル変数(sic!)であると考えます。 user_idpost_idを取り除くと、それはおそらく漏れて停止されます:

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

理由はどのようにRubyのstores objects in RValuesです。

+0

各GC.start後、ローカル変数メモリは解放されますか? – SaravanaKumAr

+0

いいえ、正しくありません。私がリンクした答えに従ってください。 – mudasobwa

+0

たとえば、ループを1000回実行しています。そのループの中で、毎回user_id = some_valueを割り当てているだけです。また、各ループはGC.startも実行しています。その場合、メモリが解放されますか?これについてのあなたの見解は何ですか? i <1000 i ++ user_id = i GC.start end – SaravanaKumAr

関連する問題