Je suis conscient que chaque objet nécessite une mémoire de tas et que chaque primitive / référence sur la pile nécessite une mémoire de pile.
Lorsque j'essaie de créer un objet sur le tas et que la mémoire est insuffisante pour cela, la JVM crée une java.lang.OutOfMemoryError sur le tas et me la lance.
Donc implicitement, cela signifie qu'il y a de la mémoire réservée par la JVM au démarrage.
Que se passe-t-il lorsque cette mémoire réservée est utilisée (elle serait certainement utilisée, lisez la discussion ci-dessous) et que la JVM n'a pas assez de mémoire sur le tas pour créer une instance de java.lang.OutOfMemoryError ?
Est-ce que ça se bloque? Ou me lancerait-il null
car il n'y a pas de mémoire dans new
une instance de MOO?
try {
Object o = new Object();
// and operations which require memory (well.. that's like everything)
} catch (java.lang.OutOfMemoryError e) {
// JVM had insufficient memory to create an instance of java.lang.OutOfMemoryError to throw to us
// what next? hangs here, stuck forever?
// or would the machine decide to throw us a "null" ? (since it doesn't have memory to throw us anything more useful than a null)
e.printStackTrace(); // e.printStackTrace() requires memory too.. =X
}
==
Pourquoi la JVM ne pouvait-elle pas réserver suffisamment de mémoire?
Quelle que soit la quantité de mémoire réservée, il est toujours possible d'utiliser cette mémoire si la JVM n'a pas de moyen de "récupérer" cette mémoire:
try {
Object o = new Object();
} catch (java.lang.OutOfMemoryError e) {
// JVM had 100 units of "spare memory". 1 is used to create this OOM.
try {
e.printStackTrace();
} catch (java.lang.OutOfMemoryError e2) {
// JVM had 99 units of "spare memory". 1 is used to create this OOM.
try {
e.printStackTrace();
} catch (java.lang.OutOfMemoryError e3) {
// JVM had 98 units of "spare memory". 1 is used to create this OOM.
try {
e.printStackTrace();
} catch (java.lang.OutOfMemoryError e4) {
// JVM had 97 units of "spare memory". 1 is used to create this OOM.
try {
e.printStackTrace();
} catch (java.lang.OutOfMemoryError e5) {
// JVM had 96 units of "spare memory". 1 is used to create this OOM.
try {
e.printStackTrace();
} catch (java.lang.OutOfMemoryError e6) {
// JVM had 95 units of "spare memory". 1 is used to create this OOM.
e.printStackTrace();
//........the JVM can't have infinite reserved memory, he's going to run out in the end
}
}
}
}
}
}
Ou plus précisément:
private void OnOOM(java.lang.OutOfMemoryError e) {
try {
e.printStackTrace();
} catch (java.lang.OutOfMemoryError e2) {
OnOOM(e2);
}
}
OutOfMemoryException
puis faire quelque chose qui impliquait la création d'un grand tampon ...
OutOfMemoryError
et y conserve une référence. Il s'avère que la capture d'un OutOfMemoryError
n'est pas aussi utile qu'on pourrait le penser, car vous ne pouvez garantir presque rien sur l'état de votre programme lors de sa capture. Voir stackoverflow.com/questions/8728866/…