Я недавно экспериментировал с OutOfMemoryError в Java и наблюдал нижеупомянутое странное поведение, для которого у меня нет никакого объяснения.
Может ли какой-нибудь энтузиаст c человек взглянуть и предложить возможные объяснения?
Заранее спасибо!
Рассмотрим 3 прогона , где каждый прогон выглядит следующим образом:
javac SimulateOOM.java
java -Xmx100m -Xms100m SimulateOOM
Прогон 1: Выполнение кода как есть:
Вывод:
В конечном итоге
Исключение в потоке "main" java .lang.OutOfMemoryError: Java heap пробел
в SimulateOOM.main (SimulateOOM. java: 11)
Run2: Комментарий из Оператор 1 и раскомментированный Оператор 2 :
Выход:
Пойман OOM!
В конце
Run3 ( Часть раздувания разума ): вернуться к исходному коду, т.е. иметь Заявление 2 закомментированное и Заявление 1 без комментариев. Кроме того, раскомментируйте блок операторов 3 , т. Е. Раскомментируйте все закомментированные операторы, присутствующие после блока операторов 3 .
Вывод:
Поймал OOM!
В конце концов
Вопросы, которые я имею в соответствии с моими наблюдениями:
1) Как Выполнить 2 но не Выполнить 1 удается поймать исключение, когда мы знаем, что Throwable является суперклассом OutOfMemoryError?
2) Как можно раскомментировать некоторый код ( Блок операторов 3 ) может привести к ожидаемому поведению Throwable, способного перехватывать OOM?
import java.util.HashMap;
import java.util.Map;
public class SimulateOOM {
public static void main(String[] args) {
try {
int i = 0;
Map<Integer, Integer> mp = new HashMap<>();
if (true) {
while (true) {
mp.put(new Integer(i), new Integer(i+1000000));
i += 1;
}
}
}
catch (Throwable th) { // ====== Statement 1 =====
//catch (OutOfMemoryError e) { // ====== Statement 2 =====
System.err.println("Caught OOM!");
}
finally {
System.err.println("In finally");
}
}
// ================= //
// Statement block 3
// ================= //
// private static void simulateOOMCatchThrowable() {
// try {
// int i = 0;
// Map<Integer, Integer> mp = new HashMap<>();
// if (true) {
// while (true) {
// mp.put(new Integer(i), new Integer(i+1000000));
// i += 1;
// }
// }
// }
// catch (Throwable th) {
// System.err.println("Caught OOM!");
// }
// finally {
// System.err.println("In finally");
// }
// }
//
// private static void simulateOOMCatchOOM() {
// try {
// int i = 0;
// Map<Integer, Integer> mp = new HashMap<>();
// if (true) {
// while (true) {
// mp.put(new Integer(i), new Integer(i+1000000));
// i += 1;
// }
// }
// }
// catch (OutOfMemoryError e) {
// System.err.println("Caught OOM!");
// }
// finally {
// System.err.println("In finally");
// }
// }
}