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 :

Exception Java heap space


Sujet :

Langage Java

  1. #1
    Membre du Club Avatar de KnowPart
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2010
    Messages
    78
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Maroc

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Service public

    Informations forums :
    Inscription : Décembre 2010
    Messages : 78
    Points : 68
    Points
    68
    Par défaut Exception Java heap space
    J'ai eu une Exception on lançant un programme JAVA:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Exception in thread "Thread-0" java.lang.OutOfMemoryError: Java heap space
            at oracle.jdbc.dbaccess.DBItem.allocBuffer(DBItem.java:197)
            at oracle.jdbc.dbaccess.DBItem.allocBuffer(DBItem.java:225)
            at oracle.jdbc.dbaccess.DBDataSetImpl._allocItemsAndBuffers(DBDataSetImpl.java:299)
            at oracle.jdbc.dbaccess.DBDataSetImpl._allocDataAndItems(DBDataSetImpl.java:260)
            at oracle.jdbc.dbaccess.DBDataSetImpl._bindsRowCompleted(DBDataSetImpl.java:987)
            at oracle.jdbc.dbaccess.DBDataSetImpl.rowCompleted(DBDataSetImpl.java:2366)
            at oracle.jdbc.driver.OraclePreparedStatement.get_data_for_columns(OraclePreparedStatement.java:3223)
            at oracle.jdbc.driver.OraclePreparedStatement.executeUpdate(OraclePreparedStatement.java:588)
            at oracle.jdbc.driver.OraclePreparedStatement.execute(OraclePreparedStatement.java:656)
    J'ai cherché dans les forums ,j'ai trouvé dans les forums qu'il faut changer dans config.ini et augmenté le size de XX:MaxPermSize=512m ,j'ai pas trouvé le fichier,sachant que je travaille sous Netbeans

  2. #2
    Modérateur
    Avatar de Alkhan
    Homme Profil pro
    ingénieur full stack
    Inscrit en
    Octobre 2006
    Messages
    1 232
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : ingénieur full stack

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 232
    Points : 2 061
    Points
    2 061
    Par défaut
    bonjour,

    il est aussi fort probable que tu laisses des instances lors de tes accès à la base de données !
    Tu n'as pas mis la totalité de la stack trace ?
    Quel est le code qui est à l'origine de l'accès à la base ?

  3. #3
    Membre du Club Avatar de KnowPart
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2010
    Messages
    78
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Maroc

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Service public

    Informations forums :
    Inscription : Décembre 2010
    Messages : 78
    Points : 68
    Points
    68
    Par défaut
    En fait je lance deux thread ,et je ferme les connexions et les curseurs qu'on je fini le traitement ,avant de poser la question de le forums j'ai googler un peux j'ai trouvé que cette erreur est origine d'une saturation de mémoire.
    Tu n'as pas mis la totalité de la stack trace ?
    comment mettre la totalité de la stack trace?

  4. #4
    Inactif
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 28
    Points : 34
    Points
    34
    Par défaut
    Salut KnowPart,

    Lancer votre code avec les Arguments suivants:
    -Xmx1024m
    -Xms1024m
    -Xss1024k

    Bonne courage

  5. #5
    Membre du Club Avatar de KnowPart
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2010
    Messages
    78
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Maroc

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Service public

    Informations forums :
    Inscription : Décembre 2010
    Messages : 78
    Points : 68
    Points
    68
    Par défaut
    j'ai testé avec les options -Xmx1024m -Xms1024m -Xss1024k mais j'ai eu la mm exception

  6. #6
    Inactif
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 28
    Points : 34
    Points
    34
    Par défaut
    Salut,
    si t'as encore de mémoire augmentez la taille -Xmx1512m.
    Il faut absolument voir ton code pour déterminer si t'as des fuites mémoires.
    ajouter ces lignes à ton code pour voir la mémoire utilisée par votre application:



    MemoryMXBean memoryBean = ManagementFactory.getMemoryMXBean();
    system.out.println( memoryBean.getHeapMemoryUsage() );
    system.out.println( memoryBean.getNonHeapMemoryUsage() );
    bon courage

  7. #7
    Modérateur
    Avatar de Alkhan
    Homme Profil pro
    ingénieur full stack
    Inscrit en
    Octobre 2006
    Messages
    1 232
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : ingénieur full stack

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 232
    Points : 2 061
    Points
    2 061
    Par défaut
    Citation Envoyé par KnowPart Voir le message
    j'ai testé avec les options -Xmx1024m -Xms1024m -Xss1024k mais j'ai eu la mm exception
    eh oui, c'est assez courant avec les accès aux bases de données quand on gère mal les statement !
    C'est pour cela que dès le premier post j'ai demandé a voir le code !

  8. #8
    Modérateur
    Avatar de Alkhan
    Homme Profil pro
    ingénieur full stack
    Inscrit en
    Octobre 2006
    Messages
    1 232
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : ingénieur full stack

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 232
    Points : 2 061
    Points
    2 061
    Par défaut
    Citation Envoyé par KnowPart Voir le message
    ...j'ai googler un peux j'ai trouvé que cette erreur est origine d'une saturation de mémoire.
    Cette saturation mémoire peut être lié au fait que tout les objets ne sont pas libéré correctement et qui sont bien souvant des erreurs de codage.

  9. #9
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,

    Citation Envoyé par Alkhan Voir le message
    eh oui, c'est assez courant avec les accès aux bases de données quand on gère mal les statement !
    C'est pour cela que dès le premier post j'ai demandé a voir le code !
    +1

    Avant de toucher aux paramètres -Xmx et autres il faut savoir ce que l'on fait, et se poser plusieurs questions :
    • Est-ce que je ne conserverais pas inutilement des objets en mémoire (objet toujours référencé)
    • Est-ce que j'ai bien libéré les ressources que je n'utilises plus ? (de préférence via un try/finally)
    • Si oui est-ce que j'ai réellement besoin d'autant de mémoire pour mon algorithme ?


    a++

  10. #10
    Membre du Club Avatar de KnowPart
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2010
    Messages
    78
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Maroc

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Service public

    Informations forums :
    Inscription : Décembre 2010
    Messages : 78
    Points : 68
    Points
    68
    Par défaut
    J'ai ajouté l'appel à la classe pour savoir la taille de la mémoire et voilà ce qu'elle me retourne:

    init = 1073741824(1048576K) used = 14720992(14375K) committed = 1065484288(1040512K) max = 1065484288(1040512K)
    init = 12779520(12480K) used = 7816312(7633K) committed = 13402112(13088K) max = 100663296(98304K)
    cette fois le programme a mis plus de temps pour qu'il m'affiche l'exception(sans aucun changement sauf les lignes pour récupération de la taille de la mémoire).
    je voulais pas alourdir le post mais il le faut
    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
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    /*
     * To change this template, choose Tools | Templates
     * and open the template in the editor.
     */
     
    package ChargFamille;
     
    /*****les imports******/
    /**
     *
     * @author Administrateur
     */
    public class NewClass {
      private ConnOracle conn;
      private ConnMysql conmysql;
     
      final BlockingQueue<String> queuee= new ArrayBlockingQueue<String>(1000000);
      SitBean sit;
      StatBean statu;
      FamBean fam;
      ArrayList listfam=null;
      /***************************
       bloc de connexion 
      ********************* */
     
     
      public Runnable charge = new Runnable() {
      @Override
      synchronized public void run() {
      //public RecupFam()throws SQLException{
            ArrayList listfam=null;
            String requete;
            PreparedStatement ps = null;
            ResultSet rs = null;
            Date maj;
            String imma;
            int i=0;
                try{
               java.sql.Date sqlDate = new java.sql.Date(new java.util.Date().getTime());
               int year=sqlDate.getYear();
               year=year-2;
               sqlDate.setYear(year);
     
               requete="SELECT distinct(IMM_V_NUM_IMM)"
               +" FROM   D_ASS_OPER"
               +" WHERE  TEV_C_EVOP    LIKE '21%' "
               +"AND    TPR_C_PREST   IN ('AE','AM','AN','AR','AA') "
               +" AND    ASO_D_EMISS >=? and rownum<100000";
                ps=conn.getConnexion().prepareStatement(requete);
                ps.setDate(1, sqlDate);
                rs=ps.executeQuery();
     
                while(rs.next()){
     
                     imma=rs.getString("IMM_V_NUM_IMM");
     
                     GetFamille(imma);
     
                }   }
            catch (Exception exx){
                 System.err.println("[RecupFam-DatMaj] - [Erreur] - Erreur  de la requete!");
                 System.err.println("[RecupFam-DatMaj] - [Message] - " + exx.getMessage());}
     
            try{
            queuee.put("END_QUEUE");}
            catch (Exception exe){}
             try {
                ps.close();
             } catch (Exception exx) {}
               try {
                rs.close();
            } catch (Exception ex) {}
     
      }};
     
      public  void GetFamille(String imma) throws SQLException{
            String requete;
            PreparedStatement ps = null;
            ResultSet rs = null;
            Date maj;
            String prenom;
            String datnaiss;
            requete ="select IND_IND_V_NUM_INDIVIDU_1,NIT_NIT_C_NAT_INT,IND_L_PRENOM ,IND_D_NAISSANCE from d_immat  immat ,d_ind  ind , d_relation rel "
     
    	+" where immat.IMM_V_NUM_IMM 	= 1|| substr(?,2,8) and rel.IND_IND_V_NUM_INDIVIDU  = immat.IND_IND_V_NUM_INDIVIDU"
    	+" and IND_IND_V_NUM_INDIVIDU_1    = ind.IND_V_NUM_INDIVIDU"
    	+" and  NIT_NIT_C_NAT_INT = 13"
    	+" and nvl(RFA_C_ETAT,'0') = 0"
    	+" order by IND_D_NAISSANCE";
            ps=conn.getConnexion().prepareStatement(requete);
     
            ps.setString(1, imma);
            rs=ps.executeQuery();//}
     
           while(rs.next())
            {
     
           sit= AppelSit(rs.getString("IND_IND_V_NUM_INDIVIDU_1"),imma);
            //System.out.println(rs.getString("IND_IND_V_NUM_INDIVIDU_1")+"IND_IND_V_NUM_INDIVIDU_1");
           statu=AppelStat(rs.getString("IND_IND_V_NUM_INDIVIDU_1"));
     
            datnaiss=String.format("%1$td"+"/"+"%1$tm"+"/"+"%1$tY", rs.getDate("IND_D_NAISSANCE"));
            prenom=rs.getString("IND_L_PRENOM");
            String datsite =sit.getDatsit();
            String site ="SIT"+sit.getSit();
            String datstate=statu.getDatstat();
            String statue ="STAT"+statu.getStat();
     
            datsite=(datsite.substring(6, 8)+"/"+datsite.substring(4, 6)+"/"+datsite.substring(0, 4));
            datstate=(datstate.substring(6, 8)+"/"+datstate.substring(4, 6)+"/"+datstate.substring(0, 4));
     
            queuee.put(imma+"-"+prenom+"-"+datnaiss+"-"+site+"-"+datsite+"-"+statue+"-"+datstate);
     
     
     
            }
     
            }
     
     
     
             catch (Exception exx) {
                System.err.println("[ChargFamille-GetFamille] - [Erreur] - Erreur  de la requete!");
                 System.err.println("[ChargFamille-GetFamille] - [Message] - " + exx.getMessage());
            }
     
     
     
            finally{
                try {
                ps.close();
             } catch (Exception exx) {}
               try {
                rs.close();
            } catch (Exception ex) {}
            }
           // return listfam;
      }//};
      public SitBean AppelSit(String ind,String imma) throws SQLException{
            String requete;
            PreparedStatement ps = null;
            CallableStatement cs = null;
            ResultSet rs = null;
            Date maj;
            java.sql.Date sqlDate = new java.sql.Date(new java.util.Date().getTime());
            try{
             requete="call appel_situation_individu(?,?,?,?,?)";
            cs=conn.getConnexion().prepareCall(requete);
            cs.setString(1, ind);
            cs.setDate(2,sqlDate);
     
            cs.setString(3, "1"+imma.substring(1,9));
            cs.registerOutParameter(4, java.sql.Types.NUMERIC);
            cs.registerOutParameter(5, java.sql.Types.VARCHAR);
            cs.execute();
            Integer dernsit=cs.getInt(4);
            String datsit=cs.getString(5);
            sit=new SitBean(dernsit,datsit);}
            catch (Exception exx) {
                System.err.println("[ChargFamille-AppelStat] - [Erreur] - Erreur  de la requete!");
                 System.err.println("[ChargFamille-AppelStat] - [Message] - " + exx.getMessage());
            }
            finally{
            try {
                cs.close();
             } catch (Exception exx) {}}
          return sit;
        }
      public StatBean AppelStat(String ind) throws SQLException{
          String requete;
            PreparedStatement ps = null;
            CallableStatement cs = null;
            ResultSet rs = null;
            try{
            requete="call appel_statut_individu(?,?,?)";
            cs=conn.getConnexion().prepareCall(requete);
            cs.setString(1, ind);
            cs.registerOutParameter(2, java.sql.Types.NUMERIC);
            cs.registerOutParameter(3, java.sql.Types.VARCHAR);
            cs.execute();
            Integer stat=cs.getInt(2);
            String datstat=cs.getString(3);
            statu= new StatBean(stat,datstat);}
            catch (Exception exx) {
                System.err.println("[ChargFamille-AppelStat] - [Erreur] - Erreur  de la requete!");
                 System.err.println("[ChargFamille-AppelStat] - [Message] - " + exx.getMessage());
            }
            finally{
             try {
                cs.close();
             } catch (Exception exx) {}}
     
          return statu;
      }
         // public void InsertFamille(String imma,String prenom,String site,String datsite,String datstate,String statue,String datnaiss ) throws SQLException{
      public Runnable ecriture = new Runnable() {
       @Override
      synchronized public void run() {
           PreparedStatement ps = null;
           ResultSet rs = null;
     
           try{
     
            while(true)
               {
     
                  String t=queuee.take();
     
                  if(t!="END_QUEUE")
                   {
                       String[] tab=t.split("-");
     
           String requete="INSERT INTO ts_famille VALUES (?, ?, ?, ?, ?, ?, ?)";
           ps=conmysql.getConnexion().prepareStatement(requete);
     
     
     
     
           for(int j=0;j<tab.length;j++){
     
           switch(j+1)
           {
           case 1 : ps.setString(1,tab[0]);
           case 2 : ps.setString(2, tab[1]);
               case 3:
                   ps.setString(3, tab[2]);
               case 4:
                   ps.setString(4, tab[3]);
               case 5:
                   ps.setString(5, tab[4]);
           case 6
                   :ps.setString(6,tab[5]);
           case 7:ps.setString(7,tab[6]);
     
           }}ps.executeUpdate();}
     else{break;}}
           }
     
          catch (Exception exx) {
                 System.err.println("[ChargFamille-InsertFamille1111] - [Erreur] - Erreur  de la requete!");
                 System.err.println("[ChargFamille-InsertFamille] - [Message] - " + exx.getMessage());
            }
             try {
                ps.close();
             } catch (Exception exx) {}
               try {
                rs.close();
            } catch (Exception ex) {}
       }};
     
      }
    le main de lancement

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    fam=new ChargFamille(cnnOracle,cnnMySQL);
           //fam2=new ChargFamille(cnnOracle2,cnnMySQL);
           Thread t1= new Thread(fam.charge);
          // Thread t2= new Thread(fam.lecture);
           Thread t3= new Thread(fam.ecriture);
           System.out.println("tab.length");
           t1.start();
          // t2.start();
           t3.start();
            MemoryMXBean memoryBean = ManagementFactory.getMemoryMXBean();
            System.out.println( memoryBean.getHeapMemoryUsage() );
            System.out.println( memoryBean.getNonHeapMemoryUsage() );

  11. #11
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Points : 48 804
    Points
    48 804
    Par défaut
    vous êtes sur de vous rendre compte de ce que vous faites??

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
      final BlockingQueue<String> queuee= new ArrayBlockingQueue<String>(1000000);
    commencez déjà par mettre à votre queue une taille raisonnable. La vous mettez potentiellement en mémoire 1 millions de strings. Si chaque string, vu la tete qu'elles ont, occupe 1k, vous avez 1G juste pour ça!

    Ensuite
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    catch (Exception exx) {}
    //....
    System.err.println("[ChargFamille-GetFamille] - [Message] - " + exx.getMessage());
    N'abandonnez jamais une exception et son stacktrace, elle recelle des informations qui peuvent vous servir. Utilisez toujours
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    exception.printStackTrace();

    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
           for(int j=0;j<tab.length;j++){
     
           switch(j+1)
           {
           case 1 : ps.setString(1,tab[0]);
           case 2 : ps.setString(2, tab[1]);
               case 3:
                   ps.setString(3, tab[2]);
               case 4:
                   ps.setString(4, tab[3]);
               case 5:
                   ps.setString(5, tab[4]);
           case 6
                   :ps.setString(6,tab[5]);
           case 7:ps.setString(7,tab[6]);
     
           }}ps.executeUpdate();}
     else{break;}}
           }
    il est collector celui-là , avez vous déroulé votre boucle pour voir ce qu'elle fait?

    Ce code peut avantageusement être remplacé par soit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for(int j=0;j<7;j++)
        ps.setString(j+1,tab[j]);
    soit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    ps.setString(1,tab[0]);
    ps.setString(2, tab[1]);
    ps.setString(3, tab[2]);
    ps.setString(4, tab[3]);
    ps.setString(5, tab[4]);
    ps.setString(6,tab[5]);
    ps.setString(7,tab[6]);
    en tout cas, votre code ne fait certainement pas ce que vous pensez qu'il fait (indice, dans votre code, "ps.setString(7,tab[6])" sera appelé 7 fois )

    enfin, si il y a beaucoup de lignes dans la table, vérifiez que vous n'utilisez pas un scrollable resultset, certains driver gardent tout en mémoire.
    Vérifiez aussi que votre conn.getConnexion() ne retourne pas une nouvelle connexion à chaque fois. Si c'est le cas, il faudra soit penser à la réutiliser, soit penser à bien la fermer à chaque fois. L'accumulation de centaines de connexion non commitées peut vitre faire exploser la consommation mémoire

  12. #12
    Membre du Club Avatar de KnowPart
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2010
    Messages
    78
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Maroc

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Service public

    Informations forums :
    Inscription : Décembre 2010
    Messages : 78
    Points : 68
    Points
    68
    Par défaut
    Premièrement merci pour vos réponse tchize_.
    final BlockingQueue<String> queuee= new ArrayBlockingQueue<String>(1000000);
    La solution c'est de mettre une queue avec une taille de 2000 par exemple et de faire un clair à chaque fois que la queue est rempli,mais il faut mettre le Thread de l'ecriture dans la queue en wait() lors du clear().
    en utilisant le wait() et le notify() j'ai pas eu le résultats souhaité.
    prenant par exemple le code suivant:

    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
    56
    57
    58
    59
    60
    61
    package thread;
     
    import java.util.Random;
    import java.util.concurrent.ArrayBlockingQueue;
    import java.util.concurrent.BlockingQueue;
     
    public class TestQueue {
    	/**
             * @param args
             */
           // public Object o=new Object();
            final BlockingQueue<String> queue= new ArrayBlockingQueue<String>(45);
    	//public static void main(String[] args) {
    		public TestQueue(){}
    		public Runnable ecriture = new Runnable() {
    			@Override
    			public void run() {
     
                                synchronized(lecture){
     
    				Random r = new Random();
    				for (int i=0;i<40;i++){
    					try {
     
    						queue.put("Element "+i);
                                                    System.out.println("ajouté élément "+i);
     
                                                     lecture.notifyAll();
     
    						//Thread.sleep(r.nextInt(200)); // sleep entre 0 et 100ms aléatoire
    					} catch (InterruptedException e) {
    						e.printStackTrace();
    					}
    				}
    			}
                           }
     
    		};
    		public Runnable lecture = new Runnable() {
    			@Override
    			public void run() {
                                 //Object o=new Object();
                                synchronized(ecriture){
                                String b;
    				Random r = new Random();
    				for (int i=0;i<40;i++){
    					try {
                                                  //b=queue.take();
    						System.out.println("lu: "+queue.take());
                                                    ecriture.wait();
     
    						Thread.sleep(r.nextInt(300)); // sleep entre 0 et 300ms aléatoire
    					} catch (InterruptedException e) {
    						e.printStackTrace();
    					}
    				}}
    			}
    		};
    		/*new Thread(ecriture).start();
    		new Thread(lecture).start();*/
    	}
    le resultat:

    ajouté élément 0
    ajouté élément 1
    ajouté élément 2
    ajouté élément 3
    ajouté élément 4
    ajouté élément 5
    ajouté élément 6
    ajouté élément 7
    ajouté élément 8
    ajouté élément 9
    ajouté élément 10
    ajouté élément 11
    ajouté élément 12
    ajouté élément 13
    ajouté élément 14
    ajouté élément 15
    ajouté élément 16
    ajouté élément 17
    ajouté élément 18
    ajouté élément 19
    ajouté élément 20
    ajouté élément 21
    ajouté élément 22
    ajouté élément 23
    ajouté élément 24
    ajouté élément 25
    ajouté élément 26
    ajouté élément 27
    ajouté élément 28
    ajouté élément 29
    ajouté élément 30
    ajouté élément 31
    ajouté élément 32
    ajouté élément 33
    ajouté élément 34
    ajouté élément 35
    ajouté élément 36
    ajouté élément 37
    ajouté élément 38
    ajouté élément 39
    lu: Element 0
    ce que je souhaite moi c'est de mettre en attente le Thread de lecture ,et de reprendre le travaille de ce Thread (lecture) vis à le thread lecture

  13. #13
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Points : 48 804
    Points
    48 804
    Par défaut
    Citation Envoyé par KnowPart Voir le message
    Premièrement merci pour vos réponse tchize_.

    La solution c'est de mettre une queue avec une taille de 2000 par exemple et de faire un clair à chaque fois que la queue est rempli,mais il faut mettre le Thread de l'ecriture dans la queue en wait() lors du clear().
    en utilisant le wait() et le notify() j'ai pas eu le résultats souhaité.
    Vous n'avez pas à vous tapper ce bordel. Vous faites un put et il se mettra tout seul en pause en attendant un place, c'est à ça que servent les BlockingQueue. Pareil pour le take() si la queue est vide.

  14. #14
    Membre du Club Avatar de KnowPart
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2010
    Messages
    78
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Maroc

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Service public

    Informations forums :
    Inscription : Décembre 2010
    Messages : 78
    Points : 68
    Points
    68
    Par défaut
    Envoyé par tchize_
    vous êtes sur de vous rendre compte de ce que vous faites??
    Code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
      final BlockingQueue<String> queuee= new ArrayBlockingQueue<String>(1000000);
    Même en remplaçant la taille du ArrayBlockingQueue par 1000 j'ai eu la même exception.
    code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    final BlockingQueue<String> queuee= new ArrayBlockingQueue<String>(1000);
    Exception:

    Exception in thread "Thread-0" java.lang.OutOfMemoryError: Java heap space
    Envoyé par tchize_
    enfin, si il y a beaucoup de lignes dans la table, vérifiez que vous n'utilisez pas un scrollable resultset, certains driver gardent tout en mémoire.
    Vérifiez aussi que votre conn.getConnexion() ne retourne pas une nouvelle connexion à chaque fois. Si c'est le cas, il faudra soit penser à la réutiliser, soit penser à bien la fermer à chaque fois. L'accumulation de centaines de connexion non commitées peut vitre faire exploser la consommation mémoire
    j'utilise un prepared statement et je le ferme après chaque utilisation.
    j'utilise une seul connexion réutilisable et je la ferme aussi après chaque utilisation.

    Comment faire maintenant pour utilisé le code : tout en ayant pas une exception de mémoire?

    Merci

  15. #15
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Points : 48 804
    Points
    48 804
    Par défaut
    je ne vois aucun code dans ce qui est posté qui ferme la connection "après chaque utilisation" comme vous dites.

    De plus, pourriez vous nous donner le contenu de
    conn.getConnexion()
    ?

  16. #16
    Membre du Club Avatar de KnowPart
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2010
    Messages
    78
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Maroc

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Service public

    Informations forums :
    Inscription : Décembre 2010
    Messages : 78
    Points : 68
    Points
    68
    Par défaut
    Voilà le code utiliser pour ouvrir la connexion:
    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
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    public void ouvrirConnexion() throws ClassNotFoundException, SQLException
        {
            if (this.connexion == null)
            {
                try
                {
                    Class.forName(this.driver);
                }
                catch (ClassNotFoundException ex)
                {
                    System.err.println("[ConnexionBD] - [ERR] - Driver non trouver / Driver : " + this.driver);
                    System.err.println("[ConnexionBD] - [MSG] - " + ex.getMessage());
                    //
                    throw ex;
                }
                //
                try
                {
                    this.connexion = DriverManager.getConnection(this.url, this.login, this.motDePasse);
                }
                catch (SQLException ex)
                {
                    System.err.println("[ConnexionBD] - [ERR] - Erreur de connexion à la base de données / Driver : " + this.driver + " / URL : " + this.url + " / Login : " + this.login);
                    System.err.println("[ConnexionBD] - [MSG] - " + ex.getMessage());
                    //
                    throw ex;
                }
            }
            else
            {
                boolean tmp = false;
                //
                try
                {
                    tmp = this.connexion.isValid(60);
                }
                catch (SQLException ex)
                {
                    /* Ne rien faire */
                }
                //
                if (!tmp)
                {
                    try { this.connexion.close(); } catch (Exception ex) {/* Ne rien faire*/}
                    //
                    this.connexion = null;
                    //
                    try
                    {
                        Class.forName(this.driver);
                    }
                    catch (ClassNotFoundException ex)
                    {
                        System.err.println("[ConnexionBD] - [ERR] - Driver non trouver / Driver : " + this.driver);
                        System.err.println("[ConnexionBD] - [MSG] - " + ex.getMessage());
                        //
                        throw ex;
                    }
                    //
                    try
                    {
                        this.connexion = DriverManager.getConnection(url, this.login, this.motDePasse);
                    }
                    catch (SQLException ex)
                    {
                        System.err.println("[ConnexionBD] - [ERR] - Erreur de connexion à la base de données / Driver : " + this.driver + " / URL : " + this.url + " / Login : " + this.login);
                        System.err.println("[ConnexionBD] - [MSG] - " + ex.getMessage());
                        //
                        throw ex;
                    }
                }
            }
        }

    et pour avoir une instance j'utilise le code suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     public Connection getConnexion()
        {
            return this.connexion;
        }
    Sinon pour la fermeture:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    public void fermerConnexion()
        {
            if (this.connexion != null)
            {
                try { this.connexion.close(); } catch (Exception ex) {/* Ne rien faire */}
            }
            //
            this.connexion = null;
        }
    ceci est utilisé dans le main comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    cnnOracle = new ConnOracle(loginOracle, PswOracle, sidOracle, ServOracle, portOracle);
           try {
           cnnOracle.ouvrirConnexion();
    /**********
     
    Traitement
    *************/
    cnnOracle. fermerConnexion();
    Sinon pour getConnexion:

    le post :
    Merci

  17. #17
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Points : 48 804
    Points
    48 804
    Par défaut
    vous devez avoir 1 connexion par thread, et pas une connexion partagée entre tous les threads comme vous le faites maintenant. Les connexion ne sont pas threadsafe e donc leur utilisation de manière concurrente ne peux pas avoir lieu. ensuite, je ne vois nulle part dans votre code l'appel à fermer Connexion. Faites ceci, pour être propre:

    Le thread principal:
    établir une connexion
    lire des donnée DB
    nourrir la blockingQueue
    fin de connexion (close)
    fin de thread


    Les thread de traitement. Soit:
    Etablir la connexion
    tant qu'il y en as:
    prendre une unité de traitement dans la queue
    transaction begin
    mettre à jour la DB
    transaction commit
    close de tous les statements
    fin de connexion
    fin de thread

    Soit (préférable a mon avis)

    tant qu'il y en as:
    prendre une unité de traitement dans la queue
    etablir une connection (en utilisant un connexion pool pour la performance)
    transaction begin
    mettre à jour la DB
    transaction commit
    close de tous les statements et de la connexion
    fin de thread


    et s'l vous plaît, corrigez votre code pour qu'il affiche les exceptions qu'il reçois. Les exceptions sont un comportement anormale du programme ou du driver, il est important de les voir!

  18. #18
    Membre du Club Avatar de KnowPart
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2010
    Messages
    78
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Maroc

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Service public

    Informations forums :
    Inscription : Décembre 2010
    Messages : 78
    Points : 68
    Points
    68
    Par défaut
    Envoyé par tchize_
    vous devez avoir 1 connexion par thread, et pas une connexion partagée entre tous les threads comme vous le faites maintenant. Les connexion ne sont pas threadsafe e donc leur utilisation de manière concurrente ne peux pas avoir lieu. ensuite, je ne vois nulle part dans votre code l'appel à fermer Connexion. Faites ceci, pour être propre:
    En fait j'ai deux Threads :

    Le premier avec une connexion oracle.
    Le deuxiéme avec une connexion mysql.
    ceci est utilisé dans le main comme suit :

    Envoyé par KnowPart_
    Code :

    cnnOracle = new ConnOracle(loginOracle, PswOracle, sidOracle, ServOracle, portOracle);
    try {
    cnnOracle.ouvrirConnexion();
    /**********

    Traitement
    *************/
    cnnOracle. fermerConnexion();
    En fait je ne peux fermer la connexion sauf dans le cas ou je termine tous le traitement ,donc je la ferme dans le main aprés la fin des deux Thread.

    J'ai fait un profiling de mon code pour savoir ou je consomme de la mémoire ,j'ai trouvé que la class byte[] c'est elle qui prend beaucoup de mémoire,pour les autres Class de resultset et PrepareadStatement.

    le fichier joint:
    Images attachées Images attachées  

  19. #19
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Points : 48 804
    Points
    48 804
    Par défaut
    tout finit toujours sur le classe byte[], ou char[]

    ce qui importe c'est d'utiliser maintenant votre profiler pour savoir qui détient en majorité ces byte[], qui détients les références vers ces références, etc jusuq'à trouver votre code

  20. #20
    Membre du Club Avatar de KnowPart
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2010
    Messages
    78
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Maroc

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Service public

    Informations forums :
    Inscription : Décembre 2010
    Messages : 78
    Points : 68
    Points
    68
    Par défaut
    Ce qui est difficile c'est de savoir la source de cette énorme allocation de mémoire de la Class byte[] à travers le profiling,ce que je sache c'est ce qui afficher dans l'image ci-joints ,sachant que j'utilise IDE netbeans.

    par tchize_
    ce qui importe c'est d'utiliser maintenant votre profiler pour savoir qui détient en majorité ces byte[], qui détients les références vers ces références, etc jusuq'à trouver votre code
    Comment faire pour détecter à partir de jprofile de netbeans qui détient en majorité ces byte[] ,et qui détient la références vers ces références,sachant que les autre class appeler par le programme ne consomme pas beaucoup de mémoire ,en fait c'est ce qui m'affiche le profiling ?

Discussions similaires

  1. Java Heap Space : bien gérer l'exception
    Par Auteur dans le forum Débuter avec Java
    Réponses: 42
    Dernier message: 21/03/2010, 17h30
  2. Réponses: 3
    Dernier message: 12/02/2010, 18h20
  3. Réponses: 8
    Dernier message: 12/02/2010, 12h51
  4. Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
    Par Edna24 dans le forum Développement de jobs
    Réponses: 2
    Dernier message: 03/06/2009, 11h19
  5. Exception JAVA HEAP SPACE
    Par JauB dans le forum Tomcat et TomEE
    Réponses: 4
    Dernier message: 06/08/2007, 10h51

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