Doublon possible :
Créer une fuite de mémoire avec Java
Quel est le moyen le plus simple de provoquer une fuite de mémoire Java ?
Réponses
Trop de publicités?Voici un exemple simple
public class Finalizer {
@Override
protected void finalize() throws Throwable {
while (true) {
Thread.yield();
}
}
public static void main(String[] args) {
while (true) {
for (int i = 0; i < 100000; i++) {
Finalizer f = new Finalizer();
}
System.out.println("" + Runtime.getRuntime().freeMemory() + " bytes free!");
}
}
}
Utiliser:
public static List<byte[]> list = new ArrayList<byte[]>();
Et puis ajoutez de (gros) tableaux sans les supprimer. À un moment donné, vous manquerez de mémoire sans vous en douter. (Vous pouvez le faire avec n'importe quel objet, mais avec de grands tableaux complets, vous pouvez manquer de mémoire plus rapidement.)
En Java, si vous déréférencez un objet (il tombe hors de portée), il est ramassé. Vous devez donc détenir une référence à celui-ci afin d'avoir un problème de mémoire.
- Créer une collection d'objets au niveau de la classe
- Ajouter périodiquement de nouveaux objets à la collection
- Ne supprimez pas la référence à l'instance de la classe qui contient la collection
Parce qu'il y a toujours une référence à la collection et à l'instance de l'objet qui possède la collection, le ramasse-miettes ne nettoiera jamais cette mémoire, provoquant ainsi une "fuite" au fil du temps.