2013-11-22 9 views
5

私はLuaのテーブルの使用状況に関するメモリリークの問題があり、コードは以下の通りです:Luaテーブルのメモリリーク?

function workerProc() 
    -- a table holds some objects (userdata, the __gc is implememted correctly) 
    local objs = {createObj(), createObj(), ...} 
    while isWorking() do 
     -- ... 
     local query = {unpack(objs)} 
     repeat 
      -- ... 
      table.remove(query, queryIndex) 
     until #query == 0 
     sleep(1000) 
    end 
end 

テーブルobjsは、一部のユーザデータオブジェクトで初期化されており、これらのオブジェクトはありませんので、GCがするwhileループで常に利用可能ですこれらのオブジェクトに対して実行されます。 whileループでは、queryテーブルは、objs(アンパック関数を使用)のすべての要素で初期化されます。スクリプトを実行している間、私はメモリが増加し続けていることを発見しましたが、私がコメントするとlocal query = {unpack(objs)}が消えます。

私はこのコードにメモリリークの問題があるとは思わないが、query varはローカルであり、whileループの各反復後には使用できないはずですが、実際はそうです。メモリがそのテーブルで飲み込まれた理由を知っている人は誰ですか?

答えて

6

あなたのコード例から判断すると、おそらくgcはループ内で完全なコレクションサイクルを実行する機会を得ることができません。

あなたはcollectgarbage()を使用して、右内側のループの後にコレクションを強制し、それはメモリの問題を解決するかどうかを確認することができます

while isWorking() do 
    -- .. 
    local query = {unpack(objs)} 
    repeat 
     -- .. 
     table.remove(query, queryIndex) 
    until #query == 0 
    collectgarbage() 
    sleep(1000) 
end 

別の可能性は、ループの外local queryを移動し、一度の代わりに作成するテーブルを作成することですアウトターループのすべての反復で新しいテーブル。

+1

ありがとうございます!より良い方法は、内側のループからクエリテーブルを移動することです。 – Kery

関連する問題