2016-04-07 7 views
0

Ich habe eine App mit Python 3.4 und Tkinter. Meine App führt mehrere (3-5) Threads aus, und jeder Thread tut darunter.Windows Task-Manager: Python App Speicherauslastung erhöhen

  1. Endlosschleife Recvfrom() Nachricht von Socket (UDP)
  2. Endlosschleife, die die Meldung angezeigt zu bekommen und es zu einer
  3. Datei schreiben

ich auf Windows Embedded OS meine Anwendung verwenden, die basiert auf XP, und ich beobachte die Speicherauslastung mit TaskManager, , weil ich meine App für eine lange (vielleicht mehr als einen Monat) ohne Herunterfahren ausführen möchte.

Dann ist ein Problem

Speichernutzung (physische) schrittweise erhöhen, aber manchmal drastisch verringern. Insgesamt sieht es also gut aus.

Aber die virtuelle Speichergröße (VMSize) nimmt mit der Langzeitansicht zu. Zum Beispiel, als ich App gestartet habe, war VMSize 26MB. und am nächsten Tag wird es 29MB, und am nächsten Tag wird es 32MB. Es manchmal etwas erhöhen, manchmal ein wenig verringern (z. B. 20KB). aber insgesamt ist es auf einem Aufwärtstrend. Dies ist nicht so große Lautstärke, aber "zunehmende" macht mich unruhig.

Ich erwartete, dass GarbageCollection helfen könnte, also habe ich gc.collect() in meinen Code eingefügt, , so dass es alle 3 Stunden aufgerufen wird. Aber nichts hat sich geändert, und print (gc.collect()) zeigte immer 0 (außer direkt nach dem Start der App selbst).

Ist dieses Speicherleck?

Ich lese Definition von del() und Referenzzyklus kann zu Speicherverlust führen in Python, , aber ich definiere nie del() von mir selbst.

Vielen Dank im Voraus.

Antwort

0

Ich habe die Ursache selbst entdeckt, also schreibe ich hier und schließe die Frage.

Die Ursache für Speicherverlust war, dass ich tkinter Funktionen aus mehreren Threads aufgerufen habe. tkinter ist nicht threadsicher, also habe ich seine Regel verletzt.

Ich habe mein Programm so geändert, dass nur Haupt-Thread tkinter Funktion dann Speicher-Leck ist gegangen.

Vielen Dank.

Verwandte Themen