| | #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? :-) |
| | |
| | #2 (Permalink) |
| Techniker 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 |
| | |
| | #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) |
| | |
| | #4 (Permalink) |
| Techniker 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) |
| | |
| | #5 (Permalink) | |
| Neuer User Registriert seit: Sep 2009
Beiträge: 6
| Zitat:
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 | |
| | |
| | #6 (Permalink) |
| mushroom powered 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
__________________ [ WHEN THE GOING GETS WEIRD THE WEIRD TURN PRO ] Download our (open-source) ANT/AS3 Project Toolkit Miroslaw Balka - How It Is - Tate Museum Of Modern Art London |
| | |
| | #7 (Permalink) |
| Techniker 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 |
| | |
| | #8 (Permalink) | ||
| Neuer User Registriert seit: Sep 2009
Beiträge: 6
| Zitat:
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:
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! | ||
| | |
| | #9 (Permalink) |
| Techniker 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 |
| | |
| | #10 (Permalink) | |
| Neuer User Registriert seit: Sep 2009
Beiträge: 6
| Zitat:
![]() Unter dem Stichwort habe ich leider nichts vernünftiges gefunden (außer diesem Thread )
| |
| | |
| | #11 (Permalink) |
| Techniker 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 |
| | |
| | #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.
|
| | |
| | #13 (Permalink) | |
| mushroom powered Registriert seit: Jun 2005 Ort: Amsterdam
Beiträge: 2.623
| Zitat:
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:
__________________ [ WHEN THE GOING GETS WEIRD THE WEIRD TURN PRO ] Download our (open-source) ANT/AS3 Project Toolkit Miroslaw Balka - How It Is - Tate Museum Of Modern Art London | |
| | |
| | #14 (Permalink) |
| Techniker Registriert seit: Sep 2003 Ort: 64807
Beiträge: 14.317
| 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) |
| | |
| | #15 (Permalink) | ||||
| Neuer User Registriert seit: Sep 2009
Beiträge: 6
| Zitat:
Zitat:
![]() Zitat:
Zitat:
![]() 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) | ||||
| | |
![]() |
| Lesezeichen |
| Themen-Optionen | |
| Ansicht | |
| |
Ä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 |