Aller au contenu


forcer ou accélérer le garbage collector


  • Vous ne pouvez pas répondre à ce sujet
14 réponses à ce sujet

#1 papwal

    Ceinture Marron

  • Members
  • 199 messages

Posté 11 août 2011 - 06:29

Je viens de faire un test de garbage collector en laissant tourner indéfiniment une application...

Il a fallu attendre plus d'une heure avant que le GC daigne nettoyer 1300 mégas de ram occupés inutilement

ça la fout un peu mal...


Y'a-t-il moyen, à défaut de pouvoir forcer le garbage collector, d'accélérer sa fréquence d'exécution ?


Par exemple, en détruisant patiemment toutes les grosses listes / proplists cellule par cellule, au lieu d'attendre que le GC le fasse lui-même après s'être aperçu au bout d'une heure que la liste n'a plus de référence ?

Modifié par papwal, 11 août 2011 - 06:30 .


#2 glurp

    Modérateur

  • Moderateur
  • 1 249 messages

Posté 11 août 2011 - 09:57

Salut papwal,

Tu avais 1300 mégas uniquement de listes ?

Pour les acteurs, il y a unload() mais pour les listes je n'ai jamais rien trouvé d'autre que de supprimer toutes ses références (tu pourrais aussi essayer de la "nettoyer" en passant toutes ses valeurs à false ou void, il me semble avoir fait des tests dans le temps là dessus mais les résultats étaient insignifiants)...

#3 papwal

    Ceinture Marron

  • Members
  • 199 messages

Posté 11 août 2011 - 12:43

glurp, le 11 août 2011 - 09:57 , dit :

Salut papwal,

Tu avais 1300 mégas uniquement de listes ?

j'ai fait un programme de test qui passe son temps à charger / décharger les données d'une lib d'environ 2 Mo

au bout d'une heure ça monte à 1,3 giga

glurp, le 11 août 2011 - 09:57 , dit :

Pour les acteurs, il y a unload() mais pour les listes je n'ai jamais rien trouvé d'autre que de supprimer toutes ses références (tu pourrais aussi essayer de la "nettoyer" en passant toutes ses valeurs à false ou void, il me semble avoir fait des tests dans le temps là dessus mais les résultats étaient insignifiants)...

effectivement je viens de coder une petite fonction récursive qui destroy les listes et ça change quedalle

#4 papwal

    Ceinture Marron

  • Members
  • 199 messages

Posté 11 août 2011 - 12:59

le seul moyen que j'ai trouvé de forcer le garbage collector c'est de mettre la fenêtre de mon .exe en icône, bref d'envoyer l'ordre depuis windows
pour un appli offline y'a ptêt moyen de le forcer avec un xtra qui envoie le même genre d'ordre... m'enfin bon c'est pas bien important les utilisateurs s'en foutent de savoir que le GC met 3 heures à se réveiller, de toutes façons cette astuce ne marche pas en mode plugin shockwave

mais c'est super chiant pour les codeurs, la chasse aux memory leaks devient mission impossible

c'est vraiment pénible ces garbage collector... c'est sensé simplifier la vie mais ça fait tout le contraire

#5 bubarnet

  • Members
  • 594 messages

Posté 11 août 2011 - 01:00

Il y a la fonction gc() qui force le garbage collector. Mais attention, elle n'est disponible qu'en javascript

function garbage(me){
_system.gc();
}

#6 papwal

    Ceinture Marron

  • Members
  • 199 messages

Posté 11 août 2011 - 06:29

merci bub

yop je connais le gc() javascript, mais ça ne nettoie que les données javascript...

dommage qu'il n'y ait pas ça pour lingo + sw3dasset + physx

#7 bubarnet

  • Members
  • 594 messages

Posté 11 août 2011 - 10:28

Ca nettoie aussi le lingo, je viens de revérifier (une liste d'image dans mon test). Par contre, je n'en sais rien pour tout ce qui est 3D.

#8 papwal

    Ceinture Marron

  • Members
  • 199 messages

Posté 13 août 2011 - 04:48

bubarnet, le 11 août 2011 - 10:28 , dit :

Ca nettoie aussi le lingo, je viens de revérifier (une liste d'image dans mon test). Par contre, je n'en sais rien pour tout ce qui est 3D.

le gc() javascript nettoie pas le lingo non...

mais ça semble le faire si tu utilises des variables globales, car les vars globales lingo créent systématiquement des doublons de données pour l'xtra javascript... d'ailleurs ça pourrit la ram, c'est pour ça qu'on préfère gèrer la prog procédurale avec des classes statiques (parent script non instanciés) plutôt qu'avec des global script

#9 bubarnet

  • Members
  • 594 messages

Posté 16 août 2011 - 03:52

Je suis sur mx2004, ça a peut être changé avec la 11/11.5, mais je confirme que _system.gc(); nettoie tout ce qui lingo, que ce soit des variables locales, property ou globales, que ce soit dans un script d'animation ou un objet instancié, ...

Je viens de refaire plusieurs tests avec tous ces cas, et la mémoire est bien nettoyée, sans un ko de perte (vérifié par le taskmanager et d'autres programmes de gestions mémoire).

#10 papwal

    Ceinture Marron

  • Members
  • 199 messages

Posté 17 août 2011 - 11:52

bubarnet, le 16 août 2011 - 03:52 , dit :

Je suis sur mx2004, ça a peut être changé avec la 11/11.5, mais je confirme que _system.gc(); nettoie tout ce qui lingo, que ce soit des variables locales, property ou globales, que ce soit dans un script d'animation ou un objet instancié, ...

Je viens de refaire plusieurs tests avec tous ces cas, et la mémoire est bien nettoyée, sans un ko de perte (vérifié par le taskmanager et d'autres programmes de gestions mémoire).

ha...

alors c'est peut-être bien les données 3d qui trainent à se garbage collecter ( dans mon test il y'a une scène w3d et une scène physx )

tu es sûr d'avoir fait le test en mode exe et/ou shockwave ?

parce que quand je teste dans director effectivement la ram est nettoyée tout de suite au ko près

mais quand je passe en shockwave/exe le garbage collector attend que la ram de ma machine soit saturée avant de faire le ménage

#11 bubarnet

  • Members
  • 594 messages

Posté 20 août 2011 - 01:41

Effectivement, j'ai fais mes tests dans l'IDE, pas en exe.

Je viens de refaire des tests en exe, et la fonction marche bien, le vidage de mémoire s'effectuant correctement à la demande.

#12 papwal

    Ceinture Marron

  • Members
  • 199 messages

Posté 20 août 2011 - 03:46

bubarnet, le 20 août 2011 - 01:41 , dit :

Effectivement, j'ai fais mes tests dans l'IDE, pas en exe.

Je viens de refaire des tests en exe, et la fonction marche bien, le vidage de mémoire s'effectuant correctement à la demande.

pour les données script c possible

mais pour les données 3d et physique je ne suis pas sur que javascript.gc() va faire quelque chose

#13 bubarnet

  • Members
  • 594 messages

Posté 20 août 2011 - 05:30

Comme je le disais plus haut, je n'ai pas testé pour la 3D, ne l'utilisant (presque) pas, je ne suis pas en mesure de tester quoi que ce soit.

Mes test se bornent à des variables lingo (image, script, ...)

#14 papwal

    Ceinture Marron

  • Members
  • 199 messages

Posté 21 août 2011 - 08:13

je viens de faire des tests plus approfondis

côté moteur sw3d pas de problème, ça se déalloc tout seul quand on delete les resources et models

c'est physx qui pose problème, il attend que la ram de la machine soit complètement saturée avant d'appeler son garbage collector.

même en faisant destroy() ou unload() ça n'y change rien

sinon physx appelle aussi son gc quand je mets ma fenêtre en icône...

Modifié par papwal, 21 août 2011 - 08:18 .


#15 papwal

    Ceinture Marron

  • Members
  • 199 messages

Posté 21 août 2011 - 08:28

j'ai dit une bêtise pour la fenêtre en icone, ça nettoie pas tout

ça fait un moment que je teste physx pour essayer de trouver moyen de nettoyer la ram plus vite mais rien à faire...





1 utilisateur(s) li(sen)t ce sujet

0 membre(s), 1 invité(s), 0 utilisateur(s) anonyme(s)

authorised training centre

Centre de Formation Mediabox - Adobe et Apple Authorised Training Center.

Déclaré auprès de la Direction du Travail et de la Formation Professionnelle

Mediabox : SARL au capital de 62.000€ - Numéro d'activité : 11 75 44555 75 - SIRET : 49371646800035

MEDIABOX, 23, rue de Bruxelles, 75009 PARIS - Tel. 0826 466 613 - Fax. 01 72 70 31 38

FFP