IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JavaScript Discussion :

Libérer la mémoire


Sujet :

JavaScript

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2018
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Avril 2018
    Messages : 3
    Points : 1
    Points
    1
    Par défaut Libérer la mémoire
    Bonjour à tous,

    Je rencontre actuellement un problème de mémoire lors du lancement d'un script. Je travaille sur des gros nuages de points sur lesquelles je réalise des calculs itératifs. Le problème est qu'à chaque itération, la mémoire physique augmente (ce qui est normal) mais ne se libère pas à la fin. J'ai essayé les outils delete / null / splice mais rien n'y fait.

    Je vous poste un programme simple illustrant mon problème*:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    function x()
    {
    var z =new Array();
    for (i=0;i<50000000;i++) {
    z[i] = 2;
    }
    };
     
    //etape1
    x();
     
    //etape2
    for (j=0; j<10000000000;j++) {
    a=4;
    }

    ainsi que l'évolution de la mémoire physique de l'ordinateur au cours du temps. La première pente correspond à l'itération de l'étape 1, et la partie supérieure correspond à l’itération de l'étape 2.

    Nom : memory.PNG
Affichages : 1007
Taille : 2,9 Ko

    Ce que je voudrais, c'est réinitialiser la mémoire entre les deux étapes, puisque je n'ai plus besoin du tableaux.

    Je vous remercie par avance!

  2. #2
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 424
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 424
    Points : 15 796
    Points
    15 796
    Par défaut
    ce que vous pouvez déjà essayer c'est "unset($z);" dés que vous n'avez plus besoin de ce tableau.

  3. #3
    Invité
    Invité(e)
    Par défaut
    @mathieu

    As-tu remarqué qu'il y a maintenant un "forum JavaScript" inséré entre le "forum Webmaster..." et le "forum PHP" ?

    Car je constate que c'est la 2ème fois que tu fais une réponse "PHP" dans le forum "JavaScript" ! ...

  4. #4
    Nouveau Candidat au Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2018
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Avril 2018
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    C'est bien ce que je pensais ^^

    Si quelqu'un à une solution pour js je suis vraiment preneur !

  5. #5
    Expert éminent sénior
    Avatar de Marco46
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2005
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2005
    Messages : 4 413
    Points : 19 609
    Points
    19 609
    Par défaut
    C'est un Garbage Collector qui libère la mémoire en JavaScript. Chaque implémentation d'un moteur JavaScript a évidemment son implémentation du GC je ne sais pas si c'est normalisé. Du coup je ne sais pas s'il y a des différences mais c'est important de la mentionner vu que tu ne précises pas dans quel moteur tu exécutes ton script, ça pourrait être du node (V8) comme du Firefox (SpiderMonkey) ou du Edge (Chakra) ou autre.

    Globalement pour ton code plusieurs problèmes :

    - pas de 'use strict';.
    - du fait de l'absence du 'use strict'; tu n'as pas d'alerte sur ta variable a de ta 2ème boucle qui est globale. Donc si tu es dans un navigateur il s'agit en fait de window.a et cette variable n'est donc jamais libérée.
    - pour libérer la mémoire dans un langage avec un GC, en dehors de l'appeler impérativement il faut supprimer toutes les références pointant sur les objets. Donc il faut faire du z = null;.
    - concernant les tableaux la bonne pratique est de faire var z = []; et pas var z = new Array();. (il faut éviter le keyword new autant que possible)

    Une lecture intéressante sur le sujet.

    Après, comme on ne connait pas le contexte d'exécution (on a bien tout le script que tu exécutes ?), ni comment tu l'exécutes (node ? navigateur ? Si oui tu restes sur la même page ? Si oui tu exécutes ça dans un bouton ?), c'est difficile d'aller plus loin.

  6. #6
    Nouveau Candidat au Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2018
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Avril 2018
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Merci de ta réponse !

    Je suis un très très récent débutant sur js c'est pour ça que je n'ai pas tous les automatismes ^^
    Je n’exécute pas le script dans un navigateur, mais dans un logiciel de traitement de nuages de points 3D (3dReshaper), qui possède une interface pour pouvoir développer ses propres scripts.

    J'ai déjà essayé toutes les solutions présentes dans la documentation que tu as posté, mais rien à faire, la mémoire physique ne se libère pas avant la fin du programme.

Discussions similaires

  1. [free] dois-je libérer la mémoire ?
    Par bulki dans le forum C
    Réponses: 9
    Dernier message: 15/05/2007, 15h59
  2. Libérer la mémoire consommée par un DataModule
    Par liviertlse dans le forum Bases de données
    Réponses: 16
    Dernier message: 10/05/2007, 14h59
  3. Libérer la mémoire en multi-thread
    Par Nathan dans le forum Général Python
    Réponses: 2
    Dernier message: 17/10/2006, 12h36
  4. Libérer la mémoire allouée à un objet
    Par boudou dans le forum Langage
    Réponses: 6
    Dernier message: 21/02/2006, 22h25
  5. Comment libérer la mémoire d'un TList ?
    Par Tchaill39 dans le forum Langage
    Réponses: 8
    Dernier message: 16/11/2005, 17h53

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo