2013-11-22 8 views
5

ich ein Speicherleck Frage über die Verwendung von lua Tabelle haben, ist der folgende Code:Lua Tabellenspeicherleck?

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 

der Tabelle objs mit einigen Userdatenobjekten und diese Objekte sind immer verfügbar in der while-Schleife wird nicht gc so initialisiert an diesen Objekten durchgeführt. In der while-Schleife wird die query Tabelle mit allen Elementen aus objs initialisiert (entpacken Sie die Funktion). Während ich das Skript ausgeführt habe, habe ich festgestellt, dass der Speicher weiter steigt, aber wenn ich local query = {unpack(objs)} auskommentiere, verschwindet es.

Ich glaube nicht, dieses Stück Code haben Problem Speicherleck verursachen die query var lokal ist, und es sollte nach jeder Iteration der while-Schleife, aber die Tatsache ist, nicht zur Verfügung. Wer weiß, warum die Erinnerung von diesem Tisch verschluckt wird?

Antwort

6

Nach Ihrem Codebeispiel zu urteilen, ist die wahrscheinliche Erklärung für das, was Sie sehen, vielleicht, dass der GC keine Chance hat, innerhalb der Schleife einen vollständigen Erfassungszyklus durchzuführen.

Sie eine Sammlung direkt nach der inneren Schleife collectgarbage() mit Kraft und sehen, ob das Problem Speicher löst:

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

Eine andere Möglichkeit ist local query außerhalb der Schleife zu bewegen und die Tabelle erstellen, sobald stattdessen eine der Schaffung neue Tabelle bei jeder Iteration in der Outer-Schleife.

+1

Danke! Ich denke, der bessere Weg ist, die Abfragetabelle aus der inneren Schleife zu entfernen. – Kery