Je suis d'accord et en désaccord avec la plupart des réponses ici.
Il y a un certain nombre de scénarios où vous pouvez attraper un OutOfMemoryError et dans mon expérience (sur Windows et Solaris Jvm), il est très rare que OutOfMemoryError est le glas pour une JVM.
Il y a une seule bonne raison pour attraper un OutOfMemoryError et c'est de fermer correctement, proprement, en libérant les ressources et la journalisation de la raison de l'échec du mieux que vous pouvez (si il est encore possible de le faire).
En général, la OutOfMemoryError se produit en raison d'un bloc d'allocation de mémoire qui ne peut être satisfaite avec le reste des ressources du tas.
Lorsque l'Erreur est levée le tas contient la même quantité d'objets alloués comme avant l'échec de l'allocation et c'est maintenant le temps de laisser tomber les références à l'exécution des objets pour libérer davantage de mémoire qui peut être nécessaire pour le nettoyage. Dans ces cas, il peut même être possible de continuer mais ce serait vraiment une mauvaise idée que vous ne pouvez jamais être certain à 100% que la JVM est dans une réparable état.
Démonstration que OutOfMemoryError ne signifie pas que la JVM est de mémoire dans le bloc catch:
private static final int MEGABYTE = (1024*1024);
public static void runOutOfMemory() {
MemoryMXBean memoryBean = ManagementFactory.getMemoryMXBean();
for (int i=1; i <= 100; i++) {
try {
byte[] bytes = new byte[MEGABYTE*500];
} catch (Exception e) {
e.printStackTrace();
} catch (OutOfMemoryError e) {
MemoryUsage heapUsage = memoryBean.getHeapMemoryUsage();
long maxMemory = heapUsage.getMax() / MEGABYTE;
long usedMemory = heapUsage.getUsed() / MEGABYTE;
System.out.println(i+ " : Memory Use :" + usedMemory + "M/" + maxMemory + "M");
}
}
}
La sortie de ce code:
1 : Memory Use :0M/247M
..
..
..
98 : Memory Use :0M/247M
99 : Memory Use :0M/247M
100 : Memory Use :0M/247M
Si l'exécution de quelque chose de critique, j'ai l'habitude de capture de l'Erreur, connectez-vous à syserr, puis connectez-vous à l'aide de mon journalisation de son choix, puis procéder à la libération des ressources et de fermer proprement. Quelle est la pire chose qui puisse arriver? La JVM est en train de mourir (ou déjà morts) de toute façon et par la capture de l'Erreur il y a au moins une chance de nettoyage.
Le problème, c'est que vous avez pour objectif la capture de ces types d'erreurs que dans des endroits où le nettoyage est possible. Ne pas couverture de catch(Throwable t) {} partout ou le non-sens comme ça.