OutOfMemory Пример

В предыдущей статье мы говорили про память в Java и сборщик мусора.

В этой статье мы посмотрим на реальном примере как забивается память и приложение выбрасывает исключение OutOfMemory.

Для этого создадим простой класс с 2 полями

Далее создадим поток (HeavyThread), в котором будем миллион раз добавлять в коллекцию новый объект, также выводить в консоль информацию сколько раз мы закончили процесс успешно. Так как переменные objectList и count являются глобальными и статическими, то сборщик мусора не доберется до них до окончания программы.

Далее в главном методе будем создавать 100 потоков и стартовать их, по окончанию выведем в консоль информацию о размере списка объектов и количестве потоков (спойлер, мы этого не увидим). Переменная threads также будет недоступна для сборщика мусора, так как используется после цикла в 100 повторов. Итак, в памяти джава машины будут перманентно находиться несколько переменных, размер которых будет постепенно увеличиваться (objectList, threads, count).

После запуска программы через несколько секунд получаем ошибку о переполнении памяти.

Как видим всего 9 потоков успели завершиться перед тем как память закончилась. Т.е. в этот миг сборщик мусора попытался подчистить память, но, увы, нечего было подчищать, так как все переменные использовались. Можно конечно же поставить try catch finally чтобы все же узнать при каком количестве элементов выбросилось исключение. Для этого добавим конструкцию в код и запустим.

Теперь мы видим, что на 11-ом потоке бросилось исключение, при этом было создано и сохранено в переменную 10 149 835 более десяти миллионов объектов (все зависит от оперативной памяти вашей машины). Поэтому в приложениях нужно быть осторожным с использованием статичных объектов и избегать подобной ситуации (утечка памяти), которая приводит к ошибке OutOfMemory.

Запись опубликована в рубрике Программирование Java. Добавьте в закладки постоянную ссылку.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *