Ich habe dieses leere Projekt, nur um die Variable System.totalMemory auszuchecken. Soweit ich sehen kann, bekomme ich diese Werte:
%Vor%Ich hatte kein Flash geöffnet, keinen Internet Browser, keine andere Flash-Instanz.
Das Projekt ist leer, nur ein statischer Text und ein dynamischer Text, der "Speicher" genannt wird. Eine *. Als Datei, die diesen Code enthält:
%Vor%Dies sind meine Veröffentlichungseinstellungen.
Ich habe im Debug und Published * .swf die gleichen Ergebnisse getestet.
Ich habe keine Ahnung von diesem, also bitte helfen.
Ich denke, Sie haben ein paar Dinge falsch.
Zuerst zeigen Ihre Traces totalMemory die letzten drei Ziffern an (da Sie es nicht im Code tun, nehme ich an, dass es an der TextField-Breite liegt). Es wächst wie folgt: 3076, 3092, 3096 usw. Dies sind (grob) Kilobyte, keine Bytes. Dann kommentieren Sie: "totalMemory nach 2 Stunden: 3887104. Mein Gott". Wenn Sie nun mit 3.887.104 3.887.104 Kb meinen, wären das etwa 3,8 Gb. Ich bezweifle, dass das der Fall ist. Nehmen wir an, Sie meinen 3.887.104 Bytes. Das sind ungefähr 3.800 Kb oder 3.8 Mb. Nicht so viel Speicher, tatsächlich, und noch wichtiger, nicht so weit von Ihren ursprünglichen 3.076 Kb.
Ich denke, dass dies tatsächlich ein anderes Poster in die Irre führt, dass der Player die Speicherbelegung um 4 Bytes erhöht hat, wenn er tatsächlich um 4.096 Bytes oder 4 KB erhöht wird.
Zweitens, obwohl der Code sehr einfach ist, verbraucht er Speicher. Zunächst wird jedes Mal, wenn das Ereignis ENTER_FRAME ausgelöst wird, ein Event-Objekt erstellt, das wiederum Verweise auf andere Objekte, Strings usw. enthält. Das braucht Erinnerung. Dann konvertieren Sie eine Zahl implizit in eine Zeichenkette (indem Sie totalMemory drucken). Das erfordert auch Speicher, ob Sie eine explizite Konvertierung durchführen oder nicht (das gleiche gilt, wenn Sie eine Ablaufverfolgung erstellen, anstatt ein Textfeld zu verwenden). Darüber hinaus gibt es sicher noch andere Sachen, die aus einer "ActionScript-Sicht" nicht ersichtlich sind.
Nun, ich denke, ein Teil des Problems besteht darin, dass Sie nur den aktuellen totalMemory verfolgen. Wenn man es betrachtet, scheint es, als würde es langsam, aber stetig wachsen. Und das ist wahr, aber Sie werden wahrscheinlich vermissen, dass der GC mit einer langsameren Geschwindigkeit loslegt und viel von dem Speicher freigibt, der sich angesammelt hat.
Dies wird deutlicher, wenn Sie den Code ändern, um einige Dinge zu berechnen.
%Vor%Ich benutze Stücke von 4096 Bytes als die Einheit (Deshalb mache ich System.totalMemory & gt; & gt; 12. Nur eine schicke Art, System.totalMemory / 4096 zu sagen). Ich denke, es ist überschaubarer und sowieso totalMemory immer ein Vielfaches von 4096 byes oder 4kb. Sie können mehr über den GC von Flash hier lesen: Ссылка . Dieser Teil des Players ist Open Source, und Sie können die Quellen sogar lesen, wenn Sie dazu geneigt sind.
Eine kurze Erklärung, was der Code verfolgt:
Sehen wir uns nun einige "Schnappschüsse" an, die mit diesem Code erstellt wurden.
Dies ist ein früher Schnappschuss, der gemacht wurde, als der swf für 3 Sekunden lief. Beachten Sie, dass der aktuelle Wert 760 lautet.
Nach ungefähr 10 Minuten:
Ein paar Dinge zu beachten:
Nun, lass die swf noch etwas laufen. Nach einer Laufzeit von 50 Minuten sieht der Schnappschuss so aus:
An dieser Stelle könnten Sie denken, dass es ein Leck gibt. Beachten Sie, dass der aktuelle Speicher 931 im Vergleich zu den ursprünglichen 760 ist.
Aber schauen Sie, was bei 3124 Sek. passiert, ~ 52 Minuten:
Bevor der GC eintrat, stieg der Höchststand auf 962. Aber danach ging die Stromstärke auf 767 zurück, wiederum sehr nahe bei den anfänglichen 760.
Also, um es auf den neuesten Stand zu bringen, bedeutet die Tatsache, dass die Speichernutzung zunimmt, nicht unbedingt, dass es ein Leck gibt. Sie müssen nur mit der Tatsache umgehen, dass der Spieler Müll gesammelt wird, und dieser Prozess ist nicht deterministisch. Der Speicher wird irgendwann zurückgewonnen (es sei denn, Sie haben natürlich ein Leck in Ihrem Code). Sie können nicht bestimmen, wann dies passieren wird. Es wird passieren, wenn der Spieler bestimmt, dass es notwendig ist. Und im Allgemeinen weiß der Spieler es besser.
Das heißt, ich denke, es ist wichtig, auf mögliche Lecks in Ihrem Code zu achten. Aber das Verfolgen von System.totalMemory wird Ihnen nicht dabei helfen, das zu bestimmen. Verwenden Sie, wenn möglich, ein Tool wie den Speicherprofiler von Flex Builder, der zwar nicht perfekt ist, Ihnen aber viel mehr nützliche Informationen bietet. Seien Sie vorsichtig beim Hinzufügen von Zuhörern zur Bühne, und wenn Sie Timer verwenden, werden die größten Fehler im Flash Player verursacht.
Sie können überprüfen, welche Version des Flash-Players Sie gerade ausführen. Wenn Sie die IDE installiert haben, gibt es eine gute Chance, dass Sie in der Debug-Version des Players laufen - was dazu führt, dass der Speicher im Vergleich zum normalen Player fast nicht mehr so oft freigegeben wird.
Wenn Sie im Debug-Player laufen, können Sie einen GC-Sweep erzwingen - System.gc ();
Soweit ich feststellen kann, gibt der Aufruf von System.totalMemory in jeder Schleife einen Wert zurück, der die Größe des von Flash verwendeten Speichers in Bytes angibt. Die durch den Aufruf von System.totalMemory zurückgegebene Benutzerkennung wird im Arbeitsspeicher gespeichert (d. H. Ihr RAM, nicht das Textfeld, das Sie als "Arbeitsspeicher" bezeichnet haben). Die memory.text-Referenz wird dann aktualisiert, um auf den Speicherplatz im Speicher zu zeigen, der von der Uint belegt ist. Die alte Uint ist noch in Erinnerung, aber es gibt keinen Hinweis darauf. Die Anzahl der Daten beträgt 32 Bit (4 Byte). Sie sehen also, dass Ihr Speicherbedarf jedes Mal um 4 Byte zunimmt. Sobald der Garbage Collector ausgeführt wird, sollte der Speicherplatz im Speicher, der von den jetzt freigegebenen Ständen belegt ist, freigegeben werden und Sie sollten den Speicherverlust sehen.
Wenn ich jedoch Ihren Beispielcode ausführe, bekomme ich nichts dergleichen. Es geht rauf und runter, es geht nicht beständig wie deines, aber ich bin auf OS X, also ist es ein anderer Player.
Da sich der Text im Textfeld ändert, muss Flash verschiedene Zeichen in den Speicher laden, um sie anzuzeigen. Dies könnte die paar hundert Bytes an Steigerung erklären, die Sie bekommen.
Bleibt allein, um wie viel größer ist der Fußabdruck?
UPDATE: Nachdem ich darüber nachgedacht habe, denke ich, dass es mit den temporären Bitmap-Grafiken zu tun hat, die für Flash zum Rendern von Text erstellt werden ... obwohl man das mit trace nicht erwartet ... obwohl trace einiges tun muss interne Dinge auch ...
Haben Sie daran gedacht, es in FlexBuilder auszuführen? Das hat ein Profiling-Tool, das Ihnen sagen kann, wohin Ihr Gedächtnis geht.
Vielleicht ist das offensichtlich, aber denken Sie daran, dass System.totalMemory Ihnen die Speicherkapazität gibt, die von Flash Player verwendet wird (statisch). Wenn Sie eine andere Flash-Anwendung geöffnet haben, könnte dies erklären, warum Ihr Speicher zunimmt.
Tags und Links memory flash actionscript-3 actionscript