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

JDBC Java Discussion :

Fuite Mémoire JAVA


Sujet :

JDBC Java

  1. #1
    Nouveau Candidat au Club
    Inscrit en
    Mai 2005
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 10
    Points : 1
    Points
    1
    Par défaut Fuite Mémoire JAVA
    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é...):

    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
    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

  2. #2
    Rédacteur
    Avatar de CyberChouan
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2007
    Messages
    2 752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Janvier 2007
    Messages : 2 752
    Points : 4 314
    Points
    4 314
    Par défaut
    Citation Envoyé par StePhAngel06 Voir le message
    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.
    Pourquoi est-ce que tu réinventes la roue?... Ce que tu as programmé là, c'est en moins bien ce que fait la classe "PreparedStatement".

    En plus, tu as des chances que cela règle automatiquement ton problème de fuite...
    Avant de poster, pensez à regarder la FAQ, les tutoriaux, la Javadoc (de la JRE que vous utilisez) et à faire une recherche
    Je ne réponds pas aux questions techniques par MP: les forums sont faits pour ça
    Mes articles et tutoriaux & Mon blog informatique

  3. #3
    Nouveau Candidat au Club
    Inscrit en
    Mai 2005
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 10
    Points : 1
    Points
    1
    Par défaut
    Bonjour,
    Effectivement, c'est la classe que j'utilisait avant.
    Mais sur des BdD assez importantes, les performances sont moins bonnes avec des prepareStatement.

    Par exemple, nous avons mesuré les temps suivants:
    Sur une BdD de 30 000 lignes, le SELECT se fait en 0ms au lieu de 16ms
    Sur une BdD de 5 500 000 lignes, 1 SELECT suivi de 10 INSERT se font en 80ms au lieu de 46sec !!!
    Ces données ont été récupérées avec le Générateur de Profil Microsoft.

  4. #4
    Membre chevronné
    Avatar de Deadpool
    Homme Profil pro
    Inscrit en
    Novembre 2005
    Messages
    1 312
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2005
    Messages : 1 312
    Points : 2 011
    Points
    2 011
    Par défaut
    Bonjour, commence déjà par virer cette horreur qui me fait mal aux yeux :

    Citation Envoyé par StePhAngel06 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    String theQuery = new String("SELECT NAME FROM MY_TABLE WHERE VAL1 = ? AND VAL2 = ?");
    Il ne faut JAMAIS utiliser ce constructeur de String qui est une HERESIE car il crée un objet supplémentaire inutilement.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    String theQuery = "SELECT NAME FROM MY_TABLE WHERE VAL1 = ? AND VAL2 = ?";

    -"Tout ça me paraît très mal organisé. Je veux déposer une réclamation. Je paye mes impôts, après tout!"
    -"JE SUIS LA MORT, PAS LES IMPÔTS! MOI, JE N'ARRIVE QU'UNE FOIS".

    Pieds d'argile (1996), Terry Pratchett 1948 - 2015
    (trad. Patrick Couton)

  5. #5
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 310
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 310
    Points : 9 522
    Points
    9 522
    Billets dans le blog
    1
    Par défaut
    Si c'est moins performant avec un preparedStatement, c'est certainement du fait du drive JDBC, mais bon, si tu préfères utiliser ce genre de code, essaye avec un StringBuilder plutôt que des "'" + val1 + "'".
    Dans cette opération, tu passes par plusieurs variables String intermédiaires, c'est peut-être l'origine de ton problème de fuite...

    Je te conseil vivement d'utiliser les preparedStatements, sinon, gare aux ' dans ta chaine de caractères !

    A+
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  6. #6
    Nouveau Candidat au Club
    Inscrit en
    Mai 2005
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 10
    Points : 1
    Points
    1
    Par défaut
    Merci pour vos réponses, mais j'ai également essayé avec des StingBuffer, voir même avec des bytes, et le résultat est toujours le même.
    Par contre, si j'exécute ce même code et que, au dernier moment, au lieu d'utiliser la chaine theQuery, j'utilise une String 'en dur', il n'y a plus de fuite de mémoire.
    Par exemple, pour faire un essai, je mets :
    Si Val1 == 1 et que Val2 == "TOTO"
    alors theQuery = "SELECT NAME FROM MY_TABLE WHERE VAL1 = '0' AND VAL2 = 'TOTO'"
    Dans ce cas là, JProfiler n'indique plus de fuite de mémoire.

    Il semblerait donc que le problème soit lié à la manipulation d'une chaîne si cette dernière est passé executeQuery(...)....
    Bizarre....

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    511
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 511
    Points : 386
    Points
    386
    Par défaut
    Question à 2 balles
    pourquoi faire simple quend on peut faire compliqué
    pourquoi ne pas avoir écrit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    String theQuery = "SELECT NAME FROM MY_TABLE WHERE VAL1 = '" + val1 + "' AND VAL2 = '" + val2 + "'"

  8. #8
    Nouveau Candidat au Club
    Inscrit en
    Mai 2005
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 10
    Points : 1
    Points
    1
    Par défaut
    Bonjour (et encore merci),
    J'ai aussi essayé ça, mais même sanction... fuite, fuite, fuite....

    J'ai également essayé
    StringBuffer theQuery = new StringBuffer("SELECT NAME FROM MY_TABLE WHERE VAL1 = '").append(val1).append("' AND VAL2 = '").append(val2).append("'");
    et ça ne change rien...


    Je pencherais plutôt pour un problème avec la fonction executeQuery qui ne libère pas un pointeur....
    Est-il possible de récupérer les codes des fonctions executeQuery pour les Statement et les PreparedStatement ??

  9. #9
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 310
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 310
    Points : 9 522
    Points
    9 522
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Mengué georges Voir le message
    Question à 2 balles
    pourquoi faire simple quend on peut faire compliqué
    pourquoi ne pas avoir écrit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    String theQuery = "SELECT NAME FROM MY_TABLE WHERE VAL1 = '" + val1 + "' AND VAL2 = '" + val2 + "'"
    Au risque de répéter, il est dommage d'utiliser cette forme de requête pour des question de sécurité (injection)
    Si, par exemple, votre utilisateur mettait "toto' or 1=1" comme valeur du paramètre 2, il verrait toutes les données...
    Le PreparedStatement évite ce genre de problème, en plus de gérer correctement une valeur du genre "l'evenement" (avec apostrophe) qui poserait un sérieux problème dans le cas utilisé...

    Pour en revenir au problème de fuite, peux-tu montrer le code actuel de la méthode ?

    A+
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  10. #10
    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 StePhAngel06 Voir le message
    Bonjour (et encore merci),
    J'ai aussi essayé ça, mais même sanction... fuite, fuite, fuite....
    Que veux-tu dire par "fuite" exactement ?
    La concaténation de chaine génère un objet temporaire... mais il sera bien effacé par le GC.

    Citation Envoyé par StePhAngel06 Voir le message
    J'ai également essayé
    StringBuffer theQuery = new StringBuffer("SELECT NAME FROM MY_TABLE WHERE VAL1 = '").append(val1).append("' AND VAL2 = '").append(val2).append("'");
    et ça ne change rien...
    StringBuffer/StringBuilder ne sont utile que si tu dois faire des concaténations sur plusieurs lignes. Si tu fait des concaténations sur une seule ligne autant utiliser l'opérateur + ce sera plus clair pour le même code !

    Citation Envoyé par StePhAngel06 Voir le message
    Est-il possible de récupérer les codes des fonctions executeQuery pour les Statement et les PreparedStatement ??
    Cela dépend de ton driver JDBC...




    A noter enfin que tu devrais utiliser des try/finally pour chacune de tes ressources, car là ta gestion des fermetures n'est pas très clair et donc source d'erreur
    Comment libérer proprement les ressources ?

    a++

  11. #11
    Nouveau Candidat au Club
    Inscrit en
    Mai 2005
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 10
    Points : 1
    Points
    1
    Par défaut
    Merci OButterlin & adiGuba.
    Je vais essayer de répondre.

    Je sais que la concaténation de chaine génère un (des) objet(s) temporaire(s). Cette mémoire est récupérée après un GC.
    Par fuite de mémoire, j'entends ceci:
    Je déroule mon programme avec JProfiler. Ce dernier m'indique les endroits dans le code où la mémoire est utilisée et en quelle quantité. Je fais des essais avec mon programme et je vois la taille mémoire augmenter. Grace à JProfiler, je lance plusieurs GC. la mémoire utilisée redescend, mais pas au niveau initial, alors que c'est ce qu'elle devrait faire.
    En ce qui concerne le code, il correspond à celui que j'ai mis tout au début de la discussion.

    Je préfère utiliser les Statements pour 2 raisons:
    - les performances : Comme je l'ai mesuré et indiqué, les performances sont nettements meilleures avec des Statements.
    - pas d'interaction IHM : je ne risque pas de me retrouver avec des mauvaises valeurs pour val1 ou val2 (je n'aurais jamais "toto' ou 1=1) car ces données me sont transmises par du matériel électronique.

    Voila, si vous avez des idées, des pistes, je suis preneur....

  12. #12
    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
    Citation Envoyé par StePhAngel06 Voir le message
    Je déroule mon programme avec JProfiler. Ce dernier m'indique les endroits dans le code où la mémoire est utilisée et en quelle quantité. Je fais des essais avec mon programme et je vois la taille mémoire augmenter. Grace à JProfiler, je lance plusieurs GC. la mémoire utilisée redescend, mais pas au niveau initial, alors que c'est ce qu'elle devrait faire.
    Est-ce que malgré les GC la taille de la mémoire augmente constamment ? Où est-ce simplement après la première exécution de la méthode ?

    Cela pourrait être lier au chargement des classes et de leurs données static...

    a++

  13. #13
    Nouveau Candidat au Club
    Inscrit en
    Mai 2005
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 10
    Points : 1
    Points
    1
    Par défaut
    Malgré les GC, la taille mémoire augmente constamment.
    Mon programme tourne et n'augmente pas en mémoire. Dès que j'interagit avec lui (et qu'il par exemple se connecte à la BdD), la taille allouée augmente et malgré les GC, elle ne redescend pas au niveau initial.
    a+

  14. #14
    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
    J'ai jeter un coup d'oeil à ton code : c'est normal que tu ne fermes pas ta connexion ?

    a++

  15. #15
    Nouveau Candidat au Club
    Inscrit en
    Mai 2005
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 10
    Points : 1
    Points
    1
    Par défaut
    Oui, car c'est la même connexion qui est utilisée à d'autres endroits.
    Je viens tout de même de faire l'essai (par acquis de concience). Dans le finally, je ferme la connexion à la BdD.
    Malheureusement, ça ne change rien...

  16. #16
    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
    On pourrait voir le code complet de la méthode...

    a++

  17. #17
    Nouveau Candidat au Club
    Inscrit en
    Mai 2005
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 10
    Points : 1
    Points
    1
    Par défaut
    Bon, alors, du coup, je me suis dis que cela venait de 'ailleurs' dans la fonction.
    Je l'ai donc dépouillée.... au maximum....
    J'ai exécuté le code suivant :

    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
    	static SQLDatabase cSqlDataBase = new SQLDatabase();
     
    	public void getNameSQL(int Val1, String Val2)
    	{
    		String theQuery = new String("SELECT NAME FROM MY_TABLE WHERE VAL1 = '" + Val1 + "' AND VAL2 = '" + Val2 + "'");
    		Statement         myStatement = null;
    		ResultSet         myResultSet = null;
     
    		try
    		{
    			myStatement = cSqlDataBase.getConnection().createStatement();
    			try 
    			{
    				myResultSet = myStatement.executeQuery(theQuery);
    			}
    			catch (Exception e)
    			{
    				System.out.println(e.getMessage());
    			}
    			theQuery = null;
    			boolean resultNext = false;
    			if (myResultSet == null)
    				return;
    			try
    			{
    				resultNext = myResultSet.next();
    			} 
    			catch (Exception e2)
    			{
    				System.out.println(e2.getMessage());
    			}
    			finally
    			{
    			   try
    				{
    					myResultSet.close();
    					myResultSet = null;
    					myStatement.clearBatch();
    					myStatement.close();
    					myStatement = null;
    				} catch (Exception e4)
    				{
    					System.out.println(e4.getMessage());
    				}
    			}
     
    			if (resultNext)
    			{
    			}
    		}
    		catch (Exception e3)
    		{
    			System.out.println(e3.getMessage());
    		}
    		finally
    		{
    		   if (myResultSet != null)
    			{
    				try
    				{
    					myResultSet.close();
    					myResultSet = null;
    					myStatement.clearBatch();
    					myStatement.close();
    					myStatement = null;
    				} catch (Exception e4)
    				{
    					System.out.println(e4.getMessage());
    				}
    			}
    		}
    	}
    Et JProfiler m'indique (pour la ligne où est définie theQuery)
    152 bytes - 1 alloc. java.lang.String.<init> à la 1ere utilisation
    304 bytes - 2 alloc. java.lang.String.<init> à la 2eme utilisation
    456 bytes - 3 alloc. java.lang.String.<init> à la 3eme utilisation
    ...

  18. #18
    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
    Citation Envoyé par StePhAngel06 Voir le message
    Et JProfiler m'indique (pour la ligne où est définie theQuery)
    152 bytes - 1 alloc. java.lang.String.<init> à la 1ere utilisation
    304 bytes - 2 alloc. java.lang.String.<init> à la 2eme utilisation
    456 bytes - 3 alloc. java.lang.String.<init> à la 3eme utilisation
    ...
    Ce ne serait pas dû à l'utilisation du constructeur de String, comme indiqué par Deadpool ?

    a++

  19. #19
    Nouveau Candidat au Club
    Inscrit en
    Mai 2005
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 10
    Points : 1
    Points
    1
    Par défaut
    J'ai mis:
    String theQuery = "SELECT NAME FROM MY_TABLE WHERE VAL1 = '" + Val1 + "' AND VAL2 = '" + Val2 + "'";
    mais ça ne change rien....

    Je ne sais pas encore comment, mais il se pourrait que la vérité... soit ailleurs... comme disait l'autre. En effet, comme je l'ai dit rapidement, les données me sont envoyées par du matériel électronique. Je peux faire la même manip en simulant à la main ce matériel électronique.. et là, il me semble que je n'ai plus la fuite de mémoire.
    De là, à penser que la fuite indiquée par JProfiler n'est pas au bon endroit....
    Bref, je continue à chercher... et merci encore de votre aide précieuse pour faire avancer le schmilblic...

  20. #20
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 310
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 310
    Points : 9 522
    Points
    9 522
    Billets dans le blog
    1
    Par défaut
    Ca veut peut-être dire que la fuite vient de l'allocation mémoire des paramètres passés par l'électronique...
    Mais là, il faudrait le code de ce côté...

    A+
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

Discussions similaires

  1. Créer une fuite mémoire (OutOfMemoryError: Java heap space)
    Par spiffou92 dans le forum Débuter avec Java
    Réponses: 12
    Dernier message: 03/02/2015, 13h45
  2. Cas d'étude : Java et fuite mémoire
    Par Bobak42 dans le forum Langage
    Réponses: 8
    Dernier message: 04/09/2012, 14h55
  3. Fuites mémoire dans une classe "java.util.HashMap$Entry"
    Par ladyingold dans le forum Collection et Stream
    Réponses: 19
    Dernier message: 10/02/2012, 15h51
  4. [tomcat][memoire] java.net.URL et fuite mémoire
    Par Seiya dans le forum Tomcat et TomEE
    Réponses: 6
    Dernier message: 09/03/2009, 10h41
  5. Réponses: 19
    Dernier message: 04/10/2006, 16h53

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