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

Langage Java Discussion :

Problème mémoire objet


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mars 2004
    Messages : 55
    Par défaut Problème mémoire objet
    Bonjour,
    J'ai un problème mémoire dans des traitements batchs sur un ensemble d'objet.

    Mes batchs initialise un ensemble d'objet qui, les unes après les autres vont réaliser un traitement.

    Pour ce faire, j'ai une collections d'objet avec pour chaque objet :
    - Initialisation de l'objet
    - Traitement de l'objet
    - Mettre à null l'objet

    Malgré cela j'ai des problèmes de mémoire. Après plusieurs traitements j'ai ma mémoire qui s'atture malgré que j'ai agrandi mes paramètres java (-Xmx512M ) et j'aimerai pas trop utiliser cette solution puisque mes batchs vont augmenter et cette solution est provisoire.

    Pour votre information. L'initialistion des objets ce fait avec des références sur des objets persistant ou qu'ils peuvent se rappeler (un peu complexe mais le but cela fonctionne très bien)

    Ma question est : comment je peux libérer proprement la mémoire d'un objet afin que les suivants prennent cet emplacement mémoire ?

    Merci d'avance

  2. #2
    Membre chevronné

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2002
    Messages
    346
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juillet 2002
    Messages : 346
    Par défaut
    Pour qu'un object soit éligible au garbage collection, il faut que plus aucune référence pointe vers lui.

    Concrétement, tu doit mettre à null toutes les références vers l'objet.

    Tu peut aussi appeler manuellement le garbage collector, mais celà n'est pas assuré (en fait, tu lui demande de se lancer, mais c'est pas sûre qu'il le fasse).

    Sinon, depuis JAVA 1.5, il y a un outils de management de la mémoire lancé en permanence dans la JVM standard de Sun, c'est juste une info, je ne me rapelle plus excatement comment le lancer mais il pourrait t'aider à trouver les possible memory leak de ton programmes.

  3. #3
    Membre chevronné Avatar de Claythest
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    558
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 558
    Par défaut
    Mettre à null les objets dont tu ne te sers plus mais dont les variables te sont toujours visibles t'aidera certainement

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mars 2004
    Messages : 55
    Par défaut
    Merci à tous, j'ai du réaliser un petit changement afin de permettre ce déchargement de mémoire :

    Avant
    List pols = emp.getListPolice();
    for (Iterator iP = pols.iterator(); iP.hasNext(); ) {
    Police pol = (Police) iP.next();
    this.getObjetDonnees().dbBegin();
    trtUnePolice(pol, date, dateT, emp, cr);
    this.getObjetDonnees().dbCommit();
    pol.initObjet();
    pol = null;
    }
    Après
    Vector pols = (Vector) emp.getListPolice();
    for (int i = pols.size(); i > 0; i--) {
    Police pol = (Police) pols.elementAt(i-1);
    this.getObjetDonnees().dbBegin();
    trtUnePolice(pol, date, dateT, emp, cr);
    this.getObjetDonnees().dbCommit();
    pol.initObjet();
    pol = null;
    // Afin de permettre la suppression de la mémoire
    pols.remove(i-1);
    System.gc();

    }
    Ce qui me libère la place.

  5. #5
    Membre émérite
    Profil pro
    Architecte technique
    Inscrit en
    Mars 2002
    Messages
    966
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France

    Informations professionnelles :
    Activité : Architecte technique

    Informations forums :
    Inscription : Mars 2002
    Messages : 966
    Par défaut
    Fais gaffe avec les ça pourrait ralentir de façon significative ton appli. Normalement si tu libères correctement les références vers tes objets, tu n'à pas besoin de faire System.gc();

  6. #6
    Membre Expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    for(...) {
        Police pol = (Police) iP.next();
        ...
        pol.initObjet();
        pol = null; // totalement inutile
    }
    Le pol=null est totalement inutile...

  7. #7
    Membre chevronné

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2002
    Messages
    346
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juillet 2002
    Messages : 346
    Par défaut
    Effectivement, pol=null est totalement inutile car pol est une variable locale à ta boucle. Donc à chaque début de tour de boucle, tu recréé pol donc tu libère la mémoire.

    Par contre, enlever pol de ton Vector libère effectivement de la mémoire. Mais pourquoi avoir remplacé ta List par un Vector qui est beaucoup moins performant (car synchronisé)?

    Sinon, l'appel à System.gc() doit effectivement être fait avec beaucoup de prudence car il est, potentiellement (car même si on appel le garbage collector on n'est jamais assuré qu'il va réellement passer) lourd en terme de performance. Si tout se passe bien, inutile de l'appeler, sinon, tu peut l'appeler mais évite de le faire trop fréquemment.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème mémoire : création d'objets Double d'origine inconnue
    Par lemmingou2010 dans le forum Général Java
    Réponses: 1
    Dernier message: 09/10/2011, 02h10
  2. Problème programmation objet
    Par Contrec dans le forum MFC
    Réponses: 54
    Dernier message: 30/03/2005, 11h30
  3. Problème d'objet attendu
    Par odelayen dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 22/02/2005, 10h27
  4. Problémes mémoire avec le bde sur des bases paradox
    Par Keke des Iles dans le forum Bases de données
    Réponses: 2
    Dernier message: 27/05/2004, 16h55
  5. Problème mémoire avec une dll par chargement dynamique
    Par widze19 dans le forum C++Builder
    Réponses: 6
    Dernier message: 15/12/2003, 13h20

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