7
votes

Java OutofMemoryError ne lance pas

J'essayais d'étudier différentes exceptions à Java et je suis tombé sur l'OutofMemoryError et je voulais le voir au travail, donc j'ai écrit le programme suivant pour créer des objets infinis en les créant dans une boucle infinie. Le programme va dans une boucle infinie qu'il ne jette pas l'exception OutofMemoryError.

class Test {
    public static void main(String...args) {
        while(true) {
            Integer i = new Integer();
        }
    }
}


0 commentaires

5 Réponses :


12
votes

Vous êtes sur la bonne voie. La seule chose que vous manquez est le concept de collecte des ordures. Le programme contient des objets entier infinis, mais après la 1ère itération, l'objet créé dans l'itération précédente devient admissible à GC.

Considérez ceci: P>

class Test {
 public static void main(String...args) {
  Vector v = new Vector(); // create a new vector.
  while(true) {
   v.addElement(new Integer(1)); // create a new Integer and add it to vector.
  }
 }
}


3 commentaires

+1 Mais j'utiliserais une liste depuis le vecteur est vieux-chapeau (sychronisé / pas une collection, etc.)


@Brian pourriez-vous élaborer? Vector est une liste et une collection.


Désolé - mon erreur re. l'activité de collecte / liste. Les opérations de vecteur sont toutes synchronisées. Voir Stackoverflow.com/questions/1792134/...



3
votes

Votre variable i est une poubelle recueillie avant de frapper le OutofMemoryError , car il n'est plus utilisé.


0 commentaires

1
votes

La variable i est uniquement scopée à la boucle, elle ne survit pas au-delà de chaque itération. Ainsi, il s'agit d'ordures recueillies avant que le programme ne puisse être à court de mémoire. Essayez de créer une arracheListe avant d'entrer dans la boucle et d'ajouter chaque instance de i à celui-ci: xxx


1 commentaires

Manquer l'argument pour le constructeur entier.



0
votes

essayer avec quelque chose comme un

liste L = nouvelle arrayliste (); int i = 0; tandis que (vrai) {l.add (i ++); }


0 commentaires

2
votes

Le moyen le plus simple d'obtenir une exception exceptionnelle est de créer un tableau qui ne s'intègre pas dans la mémoire:

public class TestOutOfMemoryException
{
    public static void main(String[] args)
    {
        final long maxMemory = Runtime.getRuntime().maxMemory();
        System.out.println(maxMemory);
        final byte[] boom = new byte[(int) maxMemory];
    }
}


0 commentaires