Fuites mémoires et Collections en Java page : 1/19
________________________________________________________________________________
COMMENT " REUSSIR " DES FUITES MEMOIRES EN JAVA ?
Date Version Modification Author
05/12/08 V1.0 Initial JL PASTUREL
________________________________________________________________________________
memoryLeak Author : Jean-Louis PASTUREL
Fuites mémoires et Collections en Java page : 2/19
________________________________________________________________________________
Table des matières
1 INTRODUCTION............................................................................................................................3
2 CLASSES DE TESTS......................................................................................................................3
2.1 Classe initiale avec fuite mémoire............................................................................................ 3
3 Génération fuite mémoire.................................................................................................................4
3.1 Lancement application .............................................................................................................4
3.2 Analyse avec Java VisualVM................................................................................................... 4
3.3 Conclusion................................................................................................................................ 6
4 CORRECTION DE LA FUITE MEMOIRE....................................................................................6
4.1 Source classe corrigée...............................................................................................................6
4.2 Lancement de l’application......................................................................................................7
4.3 Analyse Java VisualVM.......................................................................................................... 8
4.4 Conclusion test NoMemoryLeak1............................................................................................ 9
5 OUI MAIS AVEC LES WEAKREFERENCE ?............................................................................. 9
5.1 Source classe ............................................................................................................................9
5.2 Lancement de l’application....................................................................................................10
5.3 Analyse Java VisualVM........................................................................................................ 10
5.4 Conclusion test MemoryLeak2 ..............................................................................................13
6 SOLUTION : java.util.WeakHashMap......................................................................................... 13
6.1 La classe sans fuite mémoire NoMemoryLeak2.....................................................................13
6.2 Lancement de l’application....................................................................................................14
6.3 Analyse Java VisualVM......................................................................................................... 14
6.4 Conclusion test NoMemoryLeak2.......................................................................................... 15
7 Et si je dé-référence directement la Collection ?............................................................................15
7.1 Source MemoryLeak3.............................................................................................................16
7.2 Lancement de l’application....................................................................................................17
7.3 Analyse Java VisualVM......................................................................................................... 17
7.4 Conclusion test MemoryLeak3...............................................................................................18
________________________________________________________________________________
memoryLeak Author : Jean-Louis PASTUREL
Fuites mémoires et Collections en Java page : 3/19
________________________________________________________________________________
1 INTRODUCTION
Le but de ce petit document est de montrer comment on peut générer des fuites mémoires en
java en utilisant des Collections d’objets.
La JVM utilisée pour cette démonstration est la JVM HostSpot de SUN 1.6.0_10 sur
Windows XP.
Le suivi d’occupation de la heap sera fait à l’aide de l’outil Java VisualVM fournie avec
cette version. L’outil intègre aussi un profiler
2 CLASSES DE TESTS
Nous allons nous appuyer sur des classes simples, sans signification fonctionnelle réelle.
2.1 Classe initiale avec fuite mémoire
La classe principale :
MemoryLeak.java :
import java.util.ArrayList;
public class MemoryLeak {
/**
* @param args
*/
public ArrayList<Bourrage> listBourrage= new ArrayList<Bourrage>();
public void dosomething(String name)
{
Bourrage bour=new Bourrage(name);
listBourrage.add(bour);
// Faire des choses avec bour
bour=null; // Ne sert à rien, pour montre seulement que bour est
bien de-reference
;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
// On va creer la fuite
MemoryLeak memLeak=new MemoryLeak();
int nbBoucles = Integer.parseInt(args[0]);
for ( int i=0;i<nbBoucles;i++ )
{
memLeak.dosomething(args[1]);
try {
Thread.sleep(10);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
________________________________________________________________________________
memoryLeak Author : Jean-Louis PASTUREL
Fuites mémoires et Collections en Java page : 4/19
________________________________________________________________________________
e.printStackTrace();
}
}
}
}
La classe auxiliaire
Bourrage.java :
public class Bourrage {
// Un simble String
public String name="monNom" ;
public Bourrage(String _name)
{
name=_name;
}
}
3 Génération fuite mémoire
3.1 Lancement application
L’application est lancée avec les paramètres suivants :
C:\eclipse\workspace\memoryLeak\bin>java -Xms2M -Xmx2M MemoryLeak 10000000
tttyttttttttytttthhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhttttttttttttttt
3.2 Analyse avec Java VisualVM
La console Java VisualVM donne :
________________________________________________________________________________
memoryLeak Author : Jean-Louis PASTUREL
Fuites mémoires et Collections en Java page : 5/19
________________________________________________________________________________
Le diagramme en haut à gauche montre l’effet de la fuite mémoire. La mémoire résiduelle après
Garbage a tendance à monter au fur et à mesure de la vie de l’application.
On notera aussi que malgré le paramètre -Xmx à 2Mo la heap de l JVM continue à grandir au delà
des 2Mo.
________________________________________________________________________________
memoryLeak Author : Jean-Louis PASTUREL
1 / 19 100%
La catégorie de ce document est-elle correcte?
Merci pour votre participation!

Faire une suggestion

Avez-vous trouvé des erreurs dans linterface ou les textes ? Ou savez-vous comment améliorer linterface utilisateur de StudyLib ? Nhésitez pas à envoyer vos suggestions. Cest très important pour nous !