40 votes

Le moyen le plus simple de provoquer une fuite de mémoire en Java

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 ?

11voto

acconrad Points 1907

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!");
        }
    }
}

9voto

Bozho Points 273663

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.

3voto

Paul Sasik Points 37766
  1. Créer une collection d'objets au niveau de la classe
  2. Ajouter périodiquement de nouveaux objets à la collection
  3. 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.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X