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/Sampler.as#l311
----
/**
* 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/SamplerScript.cpp#l482
----
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

Répondre à