Einzelnen Beitrag anzeigen
Alt 24-01-2010, 17:58   #15 (permalink)
timlanger
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