Наблюдение за странным поведением относительно OutOfMemoryError в Java - PullRequest
2 голосов
/ 29 января 2020

Я недавно экспериментировал с 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");
//        }
//    }
}
...