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

Java Discussion :

[OutOfMemory] probleme de delestage


Sujet :

Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Juin 2005
    Messages
    175
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Juin 2005
    Messages : 175
    Par défaut [OutOfMemory] probleme de delestage
    bonjour, je suis tres embeté par un java.lang.OutOfMemoryException qui est ma hantise. j'ai identifié la localisation de l'explosion de mémoire, et c'est a peu près normal.

    voici d'abord le code :

    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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    /**
         * Initialise the table by using the PartVector of the main Appli
         * @return the Table of the components
         */
        public JTable createTable() {
            // initialisation
            //PartVector componentsSet = getAppli().getPartVector();
            PartVector partVector = getAppli().getMainApplication().getDbPicker().
                getComponents();
     
     
            // HERE : to load the partVector takes an enormous amount of memory.
            Iterator componentsIterator = partVector.iterator();
            model = new PCellardTableModel();
            sorter = new TableSorter(model);
            //table = new JTable(model);
            table = new JTable(sorter);
            //sorter.addMouseListenerToHeaderInTable(table);
            sorter.setTableHeader(table.getTableHeader());
            int i = 0;
     
            // filling the columns :
            model.addColumn("ID");      
            model.addColumn("Name");
            model.addColumn("NickName");
            model.addColumn("Type");
            model.addColumn("Price");
     
            // filling the table with correct values :
            while(componentsIterator.hasNext()){
                Part c = (Part)(componentsIterator.next());
                addRow(c);  
            }
            // prohibiting cells permutations (would be useless)
            table.getTableHeader().setReorderingAllowed(false);
     
            // selection mode setting (in order to select only one row)
            // please do not modify
            table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
            ListSelectionModel rowSM = table.getSelectionModel();
            rowSM.addListSelectionListener(new ListSelectionListener() {
    	        public void valueChanged(ListSelectionEvent e) {
    	              //Ignore extra messages.
    	              if (e.getValueIsAdjusting()) return;
    	              ListSelectionModel lsm = (ListSelectionModel)e.getSource();
    	              if (lsm.isSelectionEmpty()) {
    	                  System.out.println("no row selected");
    	              } else {
    	                  selectedRow = new Integer(lsm.getMinSelectionIndex());
    	                  displayOutline();
    	              }
    	        }
    	     });        
            return table;
        }
    le fait de charger partVector prend beaucoup de mémoire, ce qui est normal puisque je charge toute la database de components. par contre remplir la Jtable ne prend que tres peu de memoire ((ce qui est normal aussi car le vector de components contient des images que l'on ne rentre pas dans la jtable) le probleme c'est que je n'ai ici plus besoin de ce partVector après l'initialisation de la table. j'ai eu beau faire
    ou bien :
    rien n'y fait les 30 megas de memoire ne reviennent pas. comment s'en sortir ?


    PS : tant que j'y suis : voyez vous un moyen de limiter la place prise par des images en memoire, car si je load un JPG de 200k ou la meme image en GIF par exemple de 400K ? La memoire prise par l'image "Java" en memoire est la meme (genre 25 megas), je suppose qu'il doit stocker pixel par pixel.

  2. #2
    Membre émérite

    Profil pro
    Inscrit en
    Juin 2004
    Messages
    882
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2004
    Messages : 882
    Par défaut
    En Java tu ne peux pas forcer le garbage collector donc il faut que tu mettes ton objet a null et qu'il ne soit plus reference par d autres objets afin qu'il devienne, enfin, elligible pour la garbage collection

  3. #3
    Membre confirmé
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Juin 2005
    Messages
    175
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Juin 2005
    Messages : 175
    Par défaut
    c'est juste, je le fais je gagne 3 megas, bof bof

    n'existerais-t-il pas une methide java, pour connaitre la taille en memoire d'un objet ( ou mieux dans le debuggeur eclipse?)

  4. #4
    Membre émérite Avatar de remika
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    806
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 806
    Par défaut
    Citation Envoyé par SEMPERE Benjamin
    En Java tu ne peux pas forcer le garbage collector
    System.gc() ça sert à quoi ?

  5. #5
    Membre émérite

    Profil pro
    Inscrit en
    Juin 2004
    Messages
    882
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2004
    Messages : 882
    Par défaut
    Ici, tu fais une reference entre ton PartVector (un element Part du vecteur) et ton UI:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
            // filling the table with correct values : 
            while(componentsIterator.hasNext()){ 
                Part c = (Part)(componentsIterator.next()); 
                addRow(c);  
            }
    c est peut etre pour ca que les objets ne sont garbagé, non?

  6. #6
    Membre émérite

    Profil pro
    Inscrit en
    Juin 2004
    Messages
    882
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2004
    Messages : 882
    Par défaut
    Citation Envoyé par remika
    Citation Envoyé par SEMPERE Benjamin
    En Java tu ne peux pas forcer le garbage collector
    System.gc() ça sert à quoi ?
    Ben ca sert on demander a la jvm de faire un effort pour garbage collecte, mais cela n est pas reliable au niveau du temps, tu ne sais pas quand le garbage collector va passer

  7. #7
    Membre émérite Avatar de remika
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    806
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 806
    Par défaut
    ok thx

  8. #8
    Membre émérite

    Profil pro
    Inscrit en
    Juin 2004
    Messages
    882
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2004
    Messages : 882
    Par défaut
    Citation Envoyé par remika
    Citation Envoyé par SEMPERE Benjamin
    En Java tu ne peux pas forcer le garbage collector
    System.gc() ça sert à quoi ?
    une info dans la javadoc
    http://java.sun.com/j2se/1.4.2/docs/...stem.html#gc()

  9. #9
    Membre confirmé
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Juin 2005
    Messages
    175
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Juin 2005
    Messages : 175
    Par défaut
    Citation Envoyé par SEMPERE Benjamin
    Ici, tu fais une reference entre ton PartVector (un element Part du vecteur) et ton UI:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
            // filling the table with correct values : 
            while(componentsIterator.hasNext()){ 
                Part c = (Part)(componentsIterator.next()); 
                addRow(c);  
            }
    c est peut etre pour ca que les objets ne sont garbagé, non?

    si je fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
            // filling the table with correct values : 
            while(componentsIterator.hasNext()){ 
                Part c = (Part)(componentsIterator.next()); 
                addRow(c);
                c = null;
     
            }
    ca ne change rien non plus, j'ai aussi mis l'iterator a null, idem

  10. #10
    Membre émérite

    Profil pro
    Inscrit en
    Juin 2004
    Messages
    882
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2004
    Messages : 882
    Par défaut
    peux tu mettre le code de ta methode addRow stp?

  11. #11
    Membre confirmé
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Juin 2005
    Messages
    175
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Juin 2005
    Messages : 175
    Par défaut
    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
    16
    /**
         * Adds a row on model.
         * @param c : the component to add
         */
        public void addRow(Part c) {
            Vector vector = new Vector();
            vector.setSize(5);
            vector.add(0,c.getId());
            vector.add(1,c.getName());
            vector.add(2,c.getNickName());
            vector.add(3,c.getType());
            vector.add(4,c.getPrice());
            model.addRow(vector);
            System.out.println("ID added by addrow : "+c.getId());
     
        }

  12. #12
    Membre émérite

    Profil pro
    Inscrit en
    Juin 2004
    Messages
    882
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2004
    Messages : 882
    Par défaut
    Citation Envoyé par pierre.cellard
    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
    16
    /**
         * Adds a row on model.
         * @param c : the component to add
         */
        public void addRow(Part c) {
            Vector vector = new Vector();
            vector.setSize(5);
            vector.add(0,c.getId());
            vector.add(1,c.getName());
            vector.add(2,c.getNickName());
            vector.add(3,c.getType());
            vector.add(4,c.getPrice());
            model.addRow(vector);
            System.out.println("ID added by addrow : "+c.getId());
     
        }
    les elements ajoutes a ton vecteur sont soit des primitives soit des String (immutables)?

  13. #13
    Membre confirmé
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Juin 2005
    Messages
    175
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Juin 2005
    Messages : 175
    Par défaut
    oui, ou des Integer a la limite

  14. #14
    Membre chevronné Avatar de billynirvana
    Homme Profil pro
    Architecte technique
    Inscrit en
    Décembre 2004
    Messages
    472
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2004
    Messages : 472
    Par défaut
    Tu peux augmenter la taille de la JVM en lancant ton appli avec

    java --- -Xmx500M


    Ici tu alloueras 500Mo de mémoire pour ton appli sans que ca fasse un outOfMemoryExeption

    Sinon, pour connaitre la taille de mémoire allouée par la JVM de ton appli, tu peux faire un truc du style

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
          Runtime.getRuntime().gc(); // optionnel
          fenetreConsole.addMessage("Mémoire JVM: " + Runtime.getRuntime().maxMemory()/(1024*1024) + "Mo.");
          fenetreConsole.addMessage("Mémoire utilisée: " + Runtime.getRuntime().totalMemory()/(1024*1024) + "Mo.");
          // fenetreConsole.addMessage("Mémoire libre: " + Runtime.getRuntime().freeMemory()/(1024*1024) + "Mo.\n");

    Fais comme si les "fenetreConsole.addMessage()" soit des println();

  15. #15
    Membre confirmé
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Juin 2005
    Messages
    175
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Juin 2005
    Messages : 175
    Par défaut
    bien sur, mais l'interet pour moi serait plutot de faire l'operation inverse, c'est a dire changer ces parametres au lancement du programme , dans le main par exemple. maintenant est ce qu'un programme java peut setter les parametres de sa jvm, rien n'est moins sur. (?)

    a moins que l'on puisse definir cela (java --- -Xmx500M) dans le jar final executable, mais j'avour ne pas trop savoir comment fonctionnent les jar. je sais qu'il faut faire un manifest, je sais quels parametres on peut mettre dedasn et ce que ca change, mais comment ca fonctionne vraiment, je n'en sais rien

Discussions similaires

  1. probleme de OutOfMemory
    Par L4BiN dans le forum Langage
    Réponses: 17
    Dernier message: 20/05/2009, 10h46
  2. probleme outOfMemory java
    Par flora806 dans le forum Langage
    Réponses: 6
    Dernier message: 28/02/2008, 16h40
  3. [Delestage]Probleme nouveau forum/ ajouter dans le bon topic
    Par K-Kaï dans le forum Mode d'emploi & aide aux nouveaux
    Réponses: 1
    Dernier message: 19/04/2006, 15h31
  4. [Kylix] Probleme d'execution de programmes...
    Par yopziggy dans le forum EDI
    Réponses: 19
    Dernier message: 03/05/2002, 14h50
  5. [Kylix] Probleme de nombre flottant!!
    Par yopziggy dans le forum EDI
    Réponses: 5
    Dernier message: 02/05/2002, 10h13

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