Ho bisogno di comprensione da voi espertiPerché comportamenti diversi per OOME mentre si tenta di catturarlo?
Questo programma non va a prendere a blocchi (come Heap è pieno, ma voglio capire perché)
public class OOME_NotCatch {
static List l = new ArrayList();
static Long i = new Long(1);
public static void main(String[] args) {
try {
while (true) {
l.add(i);
i++;
}
} catch (OutOfMemoryError e) {
e.printStackTrace();
System.out.println("Encountered OutOfMemoryError");
}
}
}
//Console : Exception in thread "main"
Ma il sotto programma viene eseguito bene, anche dopo ottenendo OOME:
public class Catch_OOME_Collection {
static List l = new ArrayList();
public static void main(String[] args) {
try {
while (true) {
l.add(new byte[1000000]);
System.out.println("size " + l.size());
}
} catch (OutOfMemoryError e) {
System.out.println("Encountered OutOfMemoryError");
e.printStackTrace();
System.out.println("size of list is " + l.size());
Iterator i = l.iterator();
while(i.hasNext()){
System.out.println(i.next().toString());
i.remove();
}
while (true) {
System.out.println("keep printing");
}
}
}
}
sto po 'confuso, dopo aver visto i risultati diversi per lo stesso OOME errore. Please guide
Non capisco l'analisi del primo programma. Oltre a ciò, il gestore delle eccezioni gira per me, come potrebbe la JVM essere in grado di avviarsi in uno stato che non gli consentirebbe di allocare sostanzialmente alcuna memoria? Trovo più probabile che la JVM stia spegnendo prima di sysout flush, e l'utilizzo di syserr potrebbe produrre un risultato diverso per l'OP. –
La JVM deve allocare memoria per eseguire le istruzioni nel blocco catch, (stampare la traccia dello stack, ecc.) E non ne ha. Quindi esce la JVM. In breve, la mia risposta è simile alla risposta di Joni, ma più focalizzata sul perché il secondo programma lascia la JVM con memoria disponibile mentre il primo non lo fa. –
Ok, ma cosa c'entra questo con l'allocazione di un nuovo 'Long'? –