Fuite Mémoire JAVA

Signaler
Messages postés
1
Date d'inscription
jeudi 2 novembre 2006
Statut
Membre
Dernière intervention
5 décembre 2007
-
Messages postés
1
Date d'inscription
jeudi 17 septembre 2009
Statut
Membre
Dernière intervention
17 septembre 2009
-
Bonjour tout le monde ,
Alors voila, j'ai un problème de fuite de mémoire que j'aimerai vous soumettre car je n'arrive pas à trouver la solution.
J'ai une application qui interagit avec une Base de données Microsoft SQL server.
J'ai une fonction du genre (j'ai un peu simplifié...):

Object getName(int Val1, String Val2)
{
  [...]

  synchronized(this)
  {   String theQuery new String("SELECT NAME FROM MY_TABLE WHERE VAL1 ? AND VAL2 = ?");
   try
   {
     // On construit la requête
     theQuery = theQuery.replaceFirst("[?]", "'" + Val1 + "'");
     theQuery = theQuery.replaceFirst("[?]", "'" + Val2 + "'");
     myStatement = cSqlDataBase.getConnection().createStatement();
     try 
     {
        myResultSet = myStatement.executeQuery(theQuery);
     }
     catch (Exception e)
     {
         [...]
     }
     theQuery = null;
     boolean resultNext = false;
     try
     {
        resultNext = myResultSet.next();
     } 
     catch (Exception e2)
     {
         [...]
     }
    if (resultNext)
    {
         [...]
    }
    finally
    {
       if (myResultSet != null)
       {
        myResultSet.close();
        myResultSet = null;
       }
    }
   }
   catch (SQLException ex)
   {
    processException (ex);
   }
   catch(Exception e)
   {
    e.printStackTrace(Trace.getOut());
   }
   finally
   {
    try
    {
     if (myResultSet != null)
     {
      myResultSet.close();
      myResultSet = null;
     }
      myStatement.clearBatch();
      myStatement.close();
      myStatement = null;
    }
    catch (Exception e_ignore){}
   }
  }
[...]
}

Alors quelques précisions....
les '?' sont remplacés par des paramètres de la fonction, ce qui permet de faire des requêtes sur des objets différents en BdD.
J'utilise JProfiler.
Lorsque j'exécute cette fonction, JProfiler m'indique j'ai n octets, en 1 allocation, alloués à la ligne
theQuery = theQuery.replaceFirst("[?]", "'" + Val2 + "'");
Si, j'exécute à nouveau ce code, JProfiler m'indique j'ai 2 x n octets, en 2 allocation, alloués à la ligne.
Si, j'exécute à nouveau ce code, JProfiler m'indique j'ai 3 x n octets, en 3 allocation, alloués à la ligne.
Et ainsi de suite...
Pour faire des tests, j'ai essayé de créer un theQuery 'en dur', et là, pas de fuite de mémoire.
Si je fais:
myResultSet = myStatement.executeQuery(new String(theQuery));
JProfiler m'indique que la fuite de mémoire est alors déplacée sur cette ligne.
Je pense donc que le problème est lié à la modification de la chaine passée à executeQuery... mais je n'arrive pas à trouver de solution pour éviter cette fuite de mémoire.
J'ai essayé plusieur driver JDBC (Microsoft, jTDS...) mais ça ne change rien.

Help......
Quelqu'un aurait-il une idée
D'avance merci

3 réponses

Messages postés
498
Date d'inscription
mercredi 7 juillet 2004
Statut
Membre
Dernière intervention
13 juillet 2015
6
Salut, as tu trouvé une solution à ton problème, je vais bientôt m'attaquer à la recherche de fuites mémoires de mon appli J2EE, et j'ai moi aussi des méthodes de ce genre faisant des requêtes en base.

Je me demande si moi aussi j'ai pas des fuites de ce côté. Sinon, JProfiler c'est bien ? Tu as acheté une license ou tu es en trial version ?

++
Messages postés
1
Date d'inscription
mardi 19 octobre 2004
Statut
Membre
Dernière intervention
21 octobre 2008

Bonjour,

je pense que le problème se trouve dans l'instanciation de ta String, à la ligne :
String theQuery new String("SELECT NAME FROM MY_TABLE WHERE VAL1 ? AND VAL2 = ?");

essaie plutôt :
String theQuery "SELECT NAME FROM MY_TABLE WHERE VAL1 ? AND VAL2 = ?";

++
Messages postés
1
Date d'inscription
jeudi 17 septembre 2009
Statut
Membre
Dernière intervention
17 septembre 2009

Bonjour,

j'ai posté sur mon blog un article sur les fuites mémoires en java.
Il est ici : http://tcourant.wordpress.com
Vous y trouverez des conseils sur ce problème.