Intéréssant tout ça. Ya un certain temps, j'avais essayé de voir à quoi ça pouvais servir. Mais j'arrivais pas vraiment à savoir si c'était seulement l'instance de classe ou l'empreinte total en mémoire de l'objet (comprendre : l'instance + les valeurs de propriétés + autres objets liés)
Bon je m'auto répond : http://hg.mozilla.org/tamarin-redux/file/0a7bf0e036b8/core/AvmPlusScriptableObject.h#l60 ---- /** * Returns the number of bytes of memory taken by this object, that are not * also shared by any other objects. For example, a dependent String would * include sizeof(String) but not the size of the buffer of the master string; * but a dynamic String would include both sizeof(String) and the size of * the buffer. * * Used by the profiler to tell the user the shallow size of the object. */ virtual uint64_t bytesUsed() const = 0; ---- Quoi que ... Au passage le lazy init est fait aussi sur des classes non "natives", intégrées dans le playerglobal.abc à l'instar des classes commes URLLoader et des fonctions setTimeout ou setInterval : http://gist.github.com/326911 http://gist.github.com/243608 On Mar 12, 10:36 am, zwetan <[email protected]> wrote: > dans un thread précédent je parle d'un petit utilitaire > pour tracer la memoire utilisé par un object > > ---- > package > { > import flash.sampler.getSize; > import flash.utils.getQualifiedClassName; > public var size:Function = function( o:* ):void > { > var n:String = getQualifiedClassName( o ); > var s:Number = getSize( o ); > var b:String = "byte"; > if( s > 0 ){ b += "s" }; > if( s == 4 ) > { > n = "("+n+")"; > s = 0; > } > trace( n + " = " + s + " "+b ); > }} > > ---- > > voici un peu plus d'explication > > http://hg.mozilla.org/tamarin-redux/file/0a7bf0e036b8/extensions/Samp... > ---- > /** > * Returns the size in memory of a specified object when used with the > Flash Player 9.0.115.0 or later debugger version. If > * used with a Flash Player that is not the debugger version, this > method returns <code>0</code>. > * @param o The object to analyze for memory usage. > * @return The byte count of memory used by the specified object. > * @includeExample examples\DeletedObjectSizeExample.as -noswf > * @playerversion Flash 9.0.115.0 > * @langversion 3.0 > * @keyword getSize > */ > [native("SamplerScript::getSize")] > public native function getSize(o:*):Number; > ---- > > http://hg.mozilla.org/tamarin-redux/file/0a7bf0e036b8/extensions/Samp... > ---- > static double _get_size(Atom a) > { > #ifdef DEBUGGER > switch(a&7) > { > case kDoubleType: > return 8; > case kObjectType: > case kStringType: > case kNamespaceType: > AvmPlusScriptableObject *o = > (AvmPlusScriptableObject*)(a&~7); > if(o) > return (double)o->bytesUsed(); > } > return 4; > #else > (void)a; > return 0; > #endif > } > ---- > > donc cela ne marche que avec FP debug 9.0.115.0+ , sinon ca renvoit 0 > (zero) > > la partie un peu "obscure" c'est ce "return 4" > > en gros si vous avez un slot dans une class pour contenir une instance > > public var toto:MaClass; > > ce slot ne peut pas etre definit a zero > donc au pire du pire il contiendra null > > toto:MaClass = null; > > et ca flash en interne lui assignera un poids de 4 bytes > > et dans le cas ou le slot contient une instance > > toto:MaClass = new MaClass(); > > là flash ira chercher o->bytesUsed(); > et renverra le poids en mémoire utilisé par l'instance > > en soit la function size() est un peu pourri > elle ne test que pour la valeur 4 et consider que le poids en memoire > est 0 (zero) > si le poids est 4 (cad le poids par defaut) > > mais bon pour tester si un object est bien nettoyé de la mémoire en > fait c'est amha > mieux de faire comme ca, on s'attends a ce que une instance occupe x > bytes ou 0 byte, > avoir un resultat de 4 bytes, on ne fait pas automatiquement la > relation "ah oui mais c'est le poids occupé > par la valuer null en mémoire". > > l'autre chose aussi c'est de comprendre que la VM Flash fait pas mal > d'optimization et > notamment du lazy init > > cad > quand vous écrivez votre code AS3, vous pouvez utiliser toutes les > classes dites "builtin" > et que quand vous compilez, mxmlc va utiliser playerglobal.swc comme > une librairie externe > (cad il ne compile pas ce que contient playerglobal.swc dans le *.swf) > > donc si par exemple vous avez > import flash.display.Bitmap; > var b:Bitmap = new Bitmap( ... ); > > votre *.swf final ne contient que un lien symbolique vers cette class > > mais en fait ca va meme plus loin > playerglobal.swc contient bcp de definition de classes qui sont en > fait des classes natives > cad leur implementation est en C/C++ dans le flash player (pas en AS3 > comme vos propres classes) > > et que si par exemple vous avez > import flash.display.Bitmap; > > var b:Bitmap; > > if( false ) > { > b = new Bitmap( ... ); > > } > > et bien la class Bitmap ne sera pas initialisée par le flash player, > meme si celui-ci contient sa definition en natif et meme si votre > *.swf a un lien symbolique vers cette classe > > et c'est ca qui peut donner lieu a ce que j'avais appelé un "bump > memoire" > cad que tant que flash n'a pas vraiment besoin d'instancier la class > Bitmap, et bah il ne le fait pas > > mais quand flash a besoin d'instancier cette class, si vous tester la > memoire totale utilisé par le player > vous verrez une variation de qlqs MB (genre pour Bitmap et BitmapData, > ca rajoute ~7MB en memoire) > > donc oui le flash player fait du lazy init sur les classes natives, > donc quand vous etes dans un cas ou vous testez pour des memory leak, > ce genre de petite difference > ca peut jouer sur vos resultats. > > zwetan -- Vous recevez ce message, car vous êtes abonné au groupe Google Groupes FCNG. Pour envoyer un message à ce groupe, adressez un e-mail à [email protected]. Pour vous désabonner de ce groupe, envoyez un e-mail à l'adresse [email protected]. Pour plus d'options, consultez la page de ce groupe : http://groups.google.com/group/fcng?hl=fr
