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(); } } }
5 Réponses :
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. } } }
+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
Votre variable i code> est une poubelle recueillie avant de frapper le
OutofMemoryError code>, car il n'est plus utilisé. p>
La variable i code> 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 code> à celui-ci:
Manquer l'argument pour le constructeur entier.
essayer avec quelque chose comme un p>
liste L = nouvelle arrayliste ();
int i = 0;
tandis que (vrai) {l.add (i ++); } code> p>
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]; } }