Je suis conscient que chaque objet nécessite de la mémoire de tas et que chaque primitive/référence sur la pile nécessite de la mémoire de pile.
Lorsque je tente de créer un objet sur le tas et qu'il n'y a pas assez de mémoire pour le faire, la JVM crée un message d'erreur Erreur de mémoire (java.lang.OutOfMemoryError) sur le tas et me le 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 épuisée (elle le sera certainement, 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 Erreur de mémoire (java.lang.OutOfMemoryError) ?
Est-ce qu'il est juste suspendu ? Ou est-ce qu'il me lance un null
puisqu'il n'y a pas de mémoire pour new
une instance d'OOM ?
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 que cette mémoire soit utilisée si la JVM ne dispose pas d'un 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 de manière plus concise :
private void OnOOM(java.lang.OutOfMemoryError e) {
try {
e.printStackTrace();
} catch (java.lang.OutOfMemoryError e2) {
OnOOM(e2);
}
}