Что случится с программой (Go, Python, JS, PHP), если потребуется выделить память, а оперативная память в ОС закончилась?



@webwork

Ситуация:
1. Из сети (диска) читается файл чанками
2. Все это складыватся в переменную
3. Файл большой — оперативная память заканчивается
4. Что произойдет с программой (если нет никаких доп. обработок)? Будет выделено место на диске (операционной системой)? А если этого места нет больше нигде?


Решения вопроса 2



@vabka

Сначала swap, а потом out of memory exception

Комментировать

Ответы на вопрос 6



@antonwx

Будет задействован swap файл.
Если места больше нет, то будет out of memory exception и программа крашнется.
А вообще огромные файлы полностью класть в оперативную память это плохо.



@HemulGM

Зачем его в память читать? Почему не читать из сети сразу на диск?

А если твоя программа 32бит, то ты вообще не сможешь задействовать всю ОЗУ, если у тебя её больше 3гб.



@romesses

Не имеет значения какой язык программирования будет использован. ОС, прежде всего, постарается обслужить аппетиты программы. И если доступной ОЗУ не хватит, полезет в файл/раздел подкачки (swap).
В Линукс программу убьет защитный механизм OOM как только превысит определенный порог нагрузки на ресурсы системы. В Windows — не знаю, возможно просто не выделит критический кусок памяти для приложения.

А если программа не умеет обрабатывать ошибки нехватки памяти, то она просто зависнет или рухнет с посмертным дампом.

1. Из сети (диска) читается файл чанками

Ух, замечательно!

2. Все это складыватся в переменную

Что?! Зачем это понадобилось? Это как если бы в строительстве ставили кирпичный дом на фундамент целиком, а не по частям.



@Noble-Bastard

Не знаю как на других OS-ях, но Windows не выделит скорее всего. Там есть лимит



@12rbah

Зависит от того сколько требуется, если немного, то в своп запишется, если много (думаю когда объем требуемой памяти превышает своп), то система может крашнуться. Я как-то раз решил проверить это (не советую это делать), создал массив, который мог занять несколько десятков гигов и начал заполнять его в цикле, в итоге система упала с ошибкой (всего в ней было 4гб озу), тестил на 10 винде.



@webwork Автор вопроса

В общем всем спасибо.
В swarm-режиме в докере, как оказалось, все падает с кодом 137 — в swap по-умолчанию не выделяется, чтобы выделилось, нужно писать доп. параметры. Но это, конечно, спорный момент — если приложение неукротимо прожорливо, тогда это бессмысленно.

Подробнее здесь:
https://docs.docker.com/config/containers/resource…

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

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