• FFK10 - 13. bis 16. April 2010 in Köln
  • Unterstützt das Flashforum!
  • Adobe User Group
Zurück   Flashforum > Flash > Flash Fortgeschritten > Flash CS4 Professional

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 12-01-2010, 20:38   #1 (Permalink)
Neuer User
 
Registriert seit: Sep 2009
Beiträge: 6
Speicherauslastung

Hallo zusammen,
ich habe ein Problem mit der Speicherauslastung meines aktuelle Projektes.
Wenn ich es eine Weile lang benutze wird der Arbeitspeicher zugemüllt, scheinbar werden einige Objekte nicht vollständig vom GC gelöscht (kann diverse Gründe haben).
Um diese Theorie zu überprüfen wollte ich mir auf irgendeine Weise alle in der Laufzeitumgebung existierende Objekte etc. ausgeben lassen - habe aber leider bisher noch keine Möglichkeit dazu gefunden (alle grafische existierende Objekte auszugeben funktioniert aber solche die existieren aber nicht (mehr) angezeigt werden aber nicht)
Kann mir irgendwer weiterhelfen? :-)
timlanger ist offline   Mit Zitat antworten
Alt 12-01-2010, 20:57   #2 (Permalink)
Techniker
 
Benutzerbild von hgseib
 
Registriert seit: Sep 2003
Ort: 64807
Beiträge: 14.317
das ist eine gedultsarbeit, weil 'weg' heisst eben nicht auch 'aus dem speicher'. und wenn dann CG mal aufräumt, dann weisst du nicht was geblieben ist.

baue dir eigene destructor-funktionen - die muss man leider selbst aufrufen. und lass dir (in ein textfeld) ausgeben, ob die tatsächlich aufgerufen werden.

hatte auch mal so einen fall, bis ich per zufall gemerk hatte, das ein array wieder erwarten nicht gelöscht wurde. und das hat mir natürlich jede menge zeugs festgehalten.

aber einen automatismus um sowas zu erkennen gibts wohl nicht (?).
__________________
die ultimative antwort auf alle programmierfragen: der debugger!
- vor eine programmzeile klicken (==roter punkt)
- im menü "debuggen" aufrufen
- auf den grünen pfeil klicken
- im swf etwas machen (der programmablauf hält beim roten punkt)
- links die objekte auswählen, variable, interne... mal alles ansehen!
mit dem debugger kann man sein programm schrittweisse abarbeiten und in alle variable reinsehen.

mfg h.g.seib www.SeibsProgrammLaden.de
hgseib ist offline   Mit Zitat antworten
Alt 12-01-2010, 21:00   #3 (Permalink)
Neuer User
 
Registriert seit: Sep 2009
Beiträge: 6
Hallo,
naja eigentlich sollte der GC ja eben diese Funktionalität erfüllen - ich fürchte aber nach außen hin gibt der auch keine Infos raus (zumindest habe ich nix in der Art gefunden).
Desruktor schön und gut - aber wie?
Ich habe vielleicht noch vergessen zu erwähnen, dass ich in AS3 arbeite.
Ich weiss von der delete Funktion in AS1/AS2 aber die scheint mir seit AS3 die Objekte nicht mehr zu löschen sondern nur eine explizite Referenz (die die man zum löschen angibt)
timlanger ist offline   Mit Zitat antworten
Alt 12-01-2010, 21:04   #4 (Permalink)
Techniker
 
Benutzerbild von hgseib
 
Registriert seit: Sep 2003
Ort: 64807
Beiträge: 14.317
such mal hier im forum - das thema ist nicht neu.

sobalt es noch irgend eine referenz auf irgend etwas im objekt gibt - dann kann das komplette objekt nicht entfernt werden!
sehr beliebt ist es z.b. die listerer nicht zu löschen - leider haben die eine referenz auf eine funktion ...


// ganz, ganz simple:
public function destructor(): void {
trace('ich wurde gelöscht: '+this);
}

sowas halt in alle class'en, die du im verdacht hast, das sie dir erhalten bleiben. anhand der trace kann man überprüfen, ob du alle objekte ansprichst - bevor du sie (vermeintlich) löschst.
__________________
die ultimative antwort auf alle programmierfragen: der debugger!
- vor eine programmzeile klicken (==roter punkt)
- im menü "debuggen" aufrufen
- auf den grünen pfeil klicken
- im swf etwas machen (der programmablauf hält beim roten punkt)
- links die objekte auswählen, variable, interne... mal alles ansehen!
mit dem debugger kann man sein programm schrittweisse abarbeiten und in alle variable reinsehen.

mfg h.g.seib www.SeibsProgrammLaden.de

Geändert von hgseib (12-01-2010 um 21:08 Uhr)
hgseib ist offline   Mit Zitat antworten
Alt 12-01-2010, 21:11   #5 (Permalink)
Neuer User
 
Registriert seit: Sep 2009
Beiträge: 6
Zitat:
Zitat von hgseib Beitrag anzeigen
such mal hier im forum - das thema ist nicht neu.

sobalt es noch irgend eine referenz auf irgend etwas im objekt gibt - dann kann das komplette objekt nicht entfernt werden!
sehr beliebt ist es z.b. die listerer nicht zu löschen - leider haben die eine referenz auf eine funktion ...


// ganz, ganz simple:
public function destructor(): void {
trace('ich wurde gelöscht: '+this);
}

sowas halt in alle class'en, die du im verdacht hast, das sie dir erhalten bleiben. anhand der trace kann man überprüfen, ob du alle objekte ansprichst - bevor du sie (vermeintlich) löschst.
Hallo,
danke werde ich mal machen
Damit kann icht jetzt überprüfen - aber wie könnte ich sie wirklich von Hand löschen? Das wäre ja eher mein Ziel
timlanger ist offline   Mit Zitat antworten
Alt 12-01-2010, 23:55   #6 (Permalink)
mushroom powered
 
Benutzerbild von b.asile
 
Registriert seit: Jun 2005
Ort: Amsterdam
Beiträge: 2.623
Du kannst sie nicht selbst von Hand aus dem Speicher loeschen,
du musst jede Referenz darauf inkl EventListener entfernen.
Dann kuemmert sich die GarbageCollection darum.

setInterval und setTimeout sind riesiege Memory-Leaks sofern diese nicht gecleart werden.

Wenn dein Projekt sauber programmiert ist,
sollte man die Fehlerquelle nach etwas suchen herausfinden koennen.

Grus b.asile
b.asile ist offline   Mit Zitat antworten
Alt 13-01-2010, 11:08   #7 (Permalink)
Techniker
 
Benutzerbild von hgseib
 
Registriert seit: Sep 2003
Ort: 64807
Beiträge: 14.317
im grunde wünschst du dir, das der compoter intelligenter ist als du - er ist es (so hoffe ich doch) nicht ;-)

du lieferst ein 'fehlerhaftes' programm ab
und 'erwartest' jetzt vom computer, das er selbst erkennen kann was daran falsch ist.
aber ob ein befehl etwas 'sonnvolles' macht oder nicht oder gar ob ein befehl fehlt oder zu viel ist, das kann (noch) kein computer der welt feststellen.

das als erklärungsversuch, das es das nicht geben kann, was du dir wünschst.
__________________
die ultimative antwort auf alle programmierfragen: der debugger!
- vor eine programmzeile klicken (==roter punkt)
- im menü "debuggen" aufrufen
- auf den grünen pfeil klicken
- im swf etwas machen (der programmablauf hält beim roten punkt)
- links die objekte auswählen, variable, interne... mal alles ansehen!
mit dem debugger kann man sein programm schrittweisse abarbeiten und in alle variable reinsehen.

mfg h.g.seib www.SeibsProgrammLaden.de
hgseib ist offline   Mit Zitat antworten
Alt 14-01-2010, 03:54   #8 (Permalink)
Neuer User
 
Registriert seit: Sep 2009
Beiträge: 6
Zitat:
Zitat von b.asile Beitrag anzeigen
Du kannst sie nicht selbst von Hand aus dem Speicher loeschen,
du musst jede Referenz darauf inkl EventListener entfernen.
Dann kuemmert sich die GarbageCollection darum.

setInterval und setTimeout sind riesiege Memory-Leaks sofern diese nicht gecleart werden.

Wenn dein Projekt sauber programmiert ist,
sollte man die Fehlerquelle nach etwas suchen herausfinden koennen.

Grus b.asile
Hi,
ich kann mich spontan nicht entsinne eine dieser beiden Methoden benützt zu haben aber ich schau mal. Meiner Ansicht nach ist es relativ sauber - aber leider so groß, dass es alles andere als ein Spaß ist jede mögliche Fehlerquelle vom Hand im Code zu überprüfen - weswegen ich mir eben eine Ausgabe aller Objekte wünschen würde daran könnte man das wohl leichter sehen.

Zitat:
Zitat von hgseib Beitrag anzeigen
im grunde wünschst du dir, das der compoter intelligenter ist als du - er ist es (so hoffe ich doch) nicht ;-)

du lieferst ein 'fehlerhaftes' programm ab
und 'erwartest' jetzt vom computer, das er selbst erkennen kann was daran falsch ist.
aber ob ein befehl etwas 'sonnvolles' macht oder nicht oder gar ob ein befehl fehlt oder zu viel ist, das kann (noch) kein computer der welt feststellen.

das als erklärungsversuch, das es das nicht geben kann, was du dir wünschst.
Hallo,
das will ich doch nicht hoffen! Ich glaube aber du hast mich mißverstanden.
Ich würde nur gerne die Möglichkeit haben mit dem GC zu kommunizieren um ihm explizit sagen zu können, dass er ein Objekt löschen soll - etwaige Fehler würde ich dann ja sehen und beheben können. Diese Methode wäre sicherlich schneller als jede irgendwie vorstellbare Alternative zu überprüfen

Allerdings sind wir etwas von meiner Initialfrage abgekommen die (hoffe ich) lösbar sein sollte.
Und zwar eine Methode (oder irgendeine Möglichkeit) alle im Speicher befindlichen Objekte ausgeben zu lassen. Ich habe von einem Bekannten gehört, dass er vor Urzeiten mal ein AS2 Codeschnipsel gefunden hat was genau das macht nur leider hat er es natürlich nicht mehr Daraus entnehme ich aber, dass es möglich sein muss, nur wie

Über Hinweise würde ich mich sehr freuen!
timlanger ist offline   Mit Zitat antworten
Alt 14-01-2010, 11:23   #9 (Permalink)
Techniker
 
Benutzerbild von hgseib
 
Registriert seit: Sep 2003
Ort: 64807
Beiträge: 14.317
das problem (was hält er denn da noch fest) ist bekannt und das hat man z.b. in java genauso.
dort gibt es auch kein (wirklich funktioniernedes) tool dafür und java ist immerhin wesentlich mehr 'programmiertool' als flash.

google mal nach:
flex speicherbelegung
__________________
die ultimative antwort auf alle programmierfragen: der debugger!
- vor eine programmzeile klicken (==roter punkt)
- im menü "debuggen" aufrufen
- auf den grünen pfeil klicken
- im swf etwas machen (der programmablauf hält beim roten punkt)
- links die objekte auswählen, variable, interne... mal alles ansehen!
mit dem debugger kann man sein programm schrittweisse abarbeiten und in alle variable reinsehen.

mfg h.g.seib www.SeibsProgrammLaden.de
hgseib ist offline   Mit Zitat antworten
Alt 14-01-2010, 20:10   #10 (Permalink)
Neuer User
 
Registriert seit: Sep 2009
Beiträge: 6
Zitat:
Zitat von hgseib Beitrag anzeigen
das problem (was hält er denn da noch fest) ist bekannt und das hat man z.b. in java genauso.
dort gibt es auch kein (wirklich funktioniernedes) tool dafür und java ist immerhin wesentlich mehr 'programmiertool' als flash.

google mal nach:
flex speicherbelegung
Genau das würde ich ja gerne rausbekommen. Es ist ja irgendwoe vorhanden und der GC kommt ja auch dran (an die Liste aller existierenden Objekte) das muss doch möglich sein
Unter dem Stichwort habe ich leider nichts vernünftiges gefunden (außer diesem Thread )
timlanger ist offline   Mit Zitat antworten
Alt 15-01-2010, 11:02   #11 (Permalink)
Techniker
 
Benutzerbild von hgseib
 
Registriert seit: Sep 2003
Ort: 64807
Beiträge: 14.317
eventuell haben die entwickler kein interesse, das man sehen kann was und wie sie es programmiert haben (now how)

hier vielleicht noch was?
Garbage Collection in a MultiCore Modular Pipes Application
AS3 GarbageCollection Utility Flex User (<-- ist unsinnig?)
Garbage Collection and Memory Leaks - Alex?s Flex Closet
Flex 3:Feature Introductions: Performance and Memory Profiling - Adobe Labs
also um dieses thema herum gibts schon etliche beiträge. aber nicht so, wie du das willst.

das problem ist ja auch:
angenommen, du referenzierst drei objecte in einen ring (a->b, b->c, c->a). du löschst diese drei objekte, die halten sich aber gegenseitig im speicher fest. was soll dir dann ein ausdruck der speicherbelegung nützen?
du selbst musst darauf achten, das wenn du etwas löschst, dass du alles was mit darauf bezug genommen hat, mit gelöscht bzw. auf null gesetzt wird.
__________________
die ultimative antwort auf alle programmierfragen: der debugger!
- vor eine programmzeile klicken (==roter punkt)
- im menü "debuggen" aufrufen
- auf den grünen pfeil klicken
- im swf etwas machen (der programmablauf hält beim roten punkt)
- links die objekte auswählen, variable, interne... mal alles ansehen!
mit dem debugger kann man sein programm schrittweisse abarbeiten und in alle variable reinsehen.

mfg h.g.seib www.SeibsProgrammLaden.de
hgseib ist offline   Mit Zitat antworten
Alt 15-01-2010, 11:05   #12 (Permalink)
Crème brûlée
 
Registriert seit: Jan 2006
Ort: Düsseldorf
Beiträge: 595
Da lohnt sich auf jeden Fall ein Profiling der Anwendung, z.B. mit dem Flex Profiler - der sagt dann exakt, wieviele Instanzen von welcher Klasse noch im Speicher sind und wieviele Ressourcen die verbrauchen.
laxersaz ist offline   Mit Zitat antworten
Alt 15-01-2010, 11:34   #13 (Permalink)
mushroom powered
 
Benutzerbild von b.asile
 
Registriert seit: Jun 2005
Ort: Amsterdam
Beiträge: 2.623
Zitat:
Zitat von hgseib Beitrag anzeigen
Nein das geht,
jedoch nur im Debug Player.
Da ruft man auch nur die GarbageCollection auf,
infos zu objekten bekommt man da auch nicht.

Es gibt (gab?) auch einen "Hack" fuer den normalen flashplayer,
wenn man zweimal ne localconnection mit dem selben bezeichner aufgebaut hatte.

PHP-Code:
private function gcHack():void
{
       
// unsupported hack that seems to force a full GC
       
try
       {
              var 
lc1:LocalConnection = new LocalConnection();
              var 
lc2:LocalConnection = new LocalConnection();
 
              
lc1.connect('name');
              
lc2.connect('name');
       }
       catch (
e:Error)
       {
       }

b.asile ist offline   Mit Zitat antworten
Alt 15-01-2010, 12:08   #14 (Permalink)
Techniker
 
Benutzerbild von hgseib
 
Registriert seit: Sep 2003
Ort: 64807
Beiträge: 14.317
Zitat:
Zitat von b.asile Beitrag anzeigen
jedoch nur im Debug Player.
eben deshalb ;-)
man kann so prüfen, ob er komplett aufräumen würde, wenn er aufräumt.
im normalen betrieb weiss man ja nie wann er das tut, und ob ein zuwachs von restbeständen her rührt, oder daher, weil regulär weitere objekte dazu gekommen sind.

aber wenn man fehlerhaft programmiert hat, dann nützt das garnichts.
das problem ist ja nicht, das kein GC kommt, sondern das nicht alle notwendigen referenzen gelöscht wurden.
und wo diese fehler stecken .. da muss man leider selbst drauf kommen.
__________________
die ultimative antwort auf alle programmierfragen: der debugger!
- vor eine programmzeile klicken (==roter punkt)
- im menü "debuggen" aufrufen
- auf den grünen pfeil klicken
- im swf etwas machen (der programmablauf hält beim roten punkt)
- links die objekte auswählen, variable, interne... mal alles ansehen!
mit dem debugger kann man sein programm schrittweisse abarbeiten und in alle variable reinsehen.

mfg h.g.seib www.SeibsProgrammLaden.de

Geändert von hgseib (15-01-2010 um 12:10 Uhr)
hgseib ist offline   Mit Zitat antworten
Alt 24-01-2010, 17:58   #15 (Permalink)
Neuer User
 
Registriert seit: Sep 2009
Beiträge: 6
Zitat:
Zitat von hgseib Beitrag anzeigen
eventuell haben die entwickler kein interesse, das man sehen kann was und wie sie es programmiert haben (now how)

hier vielleicht noch was?
Garbage Collection in a MultiCore Modular Pipes Application
AS3 GarbageCollection Utility Flex User (<-- ist unsinnig?)
Garbage Collection and Memory Leaks - Alex?s Flex Closet
Flex 3:Feature Introductions: Performance and Memory Profiling - Adobe Labs
also um dieses thema herum gibts schon etliche beiträge. aber nicht so, wie du das willst.

das problem ist ja auch:
angenommen, du referenzierst drei objecte in einen ring (a->b, b->c, c->a). du löschst diese drei objekte, die halten sich aber gegenseitig im speicher fest. was soll dir dann ein ausdruck der speicherbelegung nützen?
du selbst musst darauf achten, das wenn du etwas löschst, dass du alles was mit darauf bezug genommen hat, mit gelöscht bzw. auf null gesetzt wird.
Diese Ringreferenzierung sollte doch dank Mark & Sweep welches ab FP 10 (oder wars sogar 9?) umgesetzt wurde gelöst sein?

Zitat:
Zitat von laxersaz Beitrag anzeigen
Da lohnt sich auf jeden Fall ein Profiling der Anwendung, z.B. mit dem Flex Profiler - der sagt dann exakt, wieviele Instanzen von welcher Klasse noch im Speicher sind und wieviele Ressourcen die verbrauchen.
Genau sowas habe ich gesucht! Vielen Dank - optimal. Habe den Fehler dank dieser Anwendung auch gefunden

Zitat:
Zitat von b.asile Beitrag anzeigen
Nein das geht,
jedoch nur im Debug Player.
Da ruft man auch nur die GarbageCollection auf,
infos zu objekten bekommt man da auch nicht.

Es gibt (gab?) auch einen "Hack" fuer den normalen flashplayer,
wenn man zweimal ne localconnection mit dem selben bezeichner aufgebaut hatte.

PHP-Code:
private function gcHack():void
{
       
// unsupported hack that seems to force a full GC
       
try
       {
              var 
lc1:LocalConnection = new LocalConnection();
              var 
lc2:LocalConnection = new LocalConnection();
 
              
lc1.connect('name');
              
lc2.connect('name');
       }
       catch (
e:Error)
       {
       }

Zitat:
Zitat von hgseib Beitrag anzeigen
eben deshalb ;-)
man kann so prüfen, ob er komplett aufräumen würde, wenn er aufräumt.
im normalen betrieb weiss man ja nie wann er das tut, und ob ein zuwachs von restbeständen her rührt, oder daher, weil regulär weitere objekte dazu gekommen sind.

aber wenn man fehlerhaft programmiert hat, dann nützt das garnichts.
das problem ist ja nicht, das kein GC kommt, sondern das nicht alle notwendigen referenzen gelöscht wurden.
und wo diese fehler stecken .. da muss man leider selbst drauf kommen.
Du wiederholst dich
Ist schon klar, dass man den fehlerhaften Code selbst finden muss aber eben eine solche Anwendung wie der Flex Profiler zeigt einem was denn so im Speicher ist und etwaige Häufungen deuten dann schon auf die verschiedenen Fehlermöglichkeiten hin.
In meinem speziellen Fall war es so, dass ich kürzlich eine Aktualisierungsfunktion für eine Vielzahl verschiedener Anzeigeobjekte geschrieben habe die nich sauber war. Anstatt die alten Anzeigen zu löschen oder zu ändern habe ich einfach neue erstellt und drüber gelegt Das hat dazu geführt, dass ich nach wenigen Minuten bereits über 1000 TextField Objekte im Speicher hatte die nicht gelöscht wurden da sie ja noch grafisch vorhanden (nur für den Nutzer nicht sichtbar) waren.

Danke jedenfalls für eure Hilfestellungen!

Geändert von timlanger (24-01-2010 um 18:00 Uhr)
timlanger ist offline   Mit Zitat antworten
Antwort

Lesezeichen

Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks sind an
Pingbacks sind an
Refbacks sind an


Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Speicherauslastung bei Anwendung DelArmgo Flash MX 2004 3 07-03-2005 16:51
FlashPlayer - (beinahe) astronomische Speicherauslastung genesys ActionScript 1 17 01-08-2004 21:40


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:04 Uhr.

Domains, Webhosting & Vserver von Host Europe
Unterstützt das Flashforum!
FFK10 - 13. bis 16. April 2010 in Köln


Copyright ©1999 – 2010 Marc Thiele und Sascha Wolter.