Вы должны использовать неизменяемые объекты передачи данных.
Пока простой объект является глубоко неизменным (это означает, что ни он, ни какие-либо его свойства не могут измениться), нет ничего плохого в использовании его на нескольких threads.
Чтобы передать экземпляры между потоками, вы можете использовать псевдо-изменяемый поточно-безопасный стек . (Это зависит от вашего дизайна)
Если пользователь или системный администратор не закрыли программу, ядро может иметь. Ядро только уничтожило бы процесс при исключительных обстоятельствах, таких как экстремальное исчерпание ресурсов (думайте mem+swap исчерпание).
Как заявили dwc и Adam Jaskiewicz, виновник, скорее всего, убийца OOM. Тем не менее, следующий вопрос, который следует ниже: Как мне предотвратить это?
Есть несколько способов:
Я обнаружил, что (2) особенно легко реализовать благодаря этой статье .
Я столкнулся с этой проблемой в последнее время. Наконец, я обнаружил, что мои процессы были уничтожены сразу после автоматического вызова обновления OpenSuse zypper. Чтобы отключить обновление zypper решил мою проблему.
Скажем, у вас есть 512 RAM + 1GB Swap memory. Теоретически, ваш ЦП имеет доступ к 1,5 ГБ виртуальной памяти.
Теперь, в течение некоторого времени все работает нормально в пределах 1,5 ГБ общей памяти. Но внезапно (или постепенно) ваша система начала потреблять все больше и больше памяти, и она достигла примерно 95% от общего объема используемой памяти.
Теперь скажите, что любой процесс запросил у ядра большой кусок памяти. Ядро проверит доступную память и обнаружит, что нет способа выделить вашему процессу больше памяти. Поэтому он попытается освободить память, вызывающую / вызывающую OOMKiller ( http://linux-mm.org/OOM ).
У OOMKiller есть собственный алгоритм оценки ранга для каждого процесса. Как правило, какой процесс использует больше памяти, он становится жертвой смерти.
Обычно в каталоге / var / log. Либо /var/log/kern.log, либо / var / log / dmesg
Надеюсь, это поможет вам.
У пользователя есть способность закрыть его собственные программы, использование уничтожают или Control+C, но я получаю впечатление, это не то, что произошло, и что пользователь жаловался Вам.
корень имеет способность закрыть программы, конечно, но если кто-то имеет корень на Вашей машине и уничтожает материал, у Вас есть большие проблемы.
Если Вы не системный администратор, системный администратор, возможно, настроил квоты на ЦП, RAM, использовании диска орта и автоуничтожает процессы, которые превышают их.
Кроме тех предположений, я не уверен без большего количества информации в программе.
У нас были повторяющиеся проблемы в соответствии с Linux на сайте для клиентов (Red Hat, я думаю) с OOMKiller (уничтожитель из памяти) уничтожающий оба наших принципиальных приложения (т.е. причина, сервер существует), и это - процессы базы данных.
В каждом случае OOMKiller просто решил, что процессы использовали для многого, снабжает... машину, даже не собирался перестать работать из-за отсутствия ресурсов. Ни приложение, ни это не являются базой данных, имеет проблемы с утечками памяти (или любая другая утечка ресурсов).
Я не эксперт Linux, но я скорее заключил, что это - алгоритм для решения, когда уничтожить что-то и что уничтожить, сложно. Кроме того, мне сказали (я не могу говорить относительно точности этого), что OOMKiller испекся в Ядро, и Вы не можете просто не выполнить его.
Это похоже на хорошую статью о предмете: Приручение уничтожителя OOM.
Суть - то, что Linux превышает возможности памяти. Когда процесс попросит больше пространства, Linux даст его, что пространство, даже если это будет требоваться другим процессом под предположением, что никто на самом деле не использует всю память, которую они просят. Процесс получит эксклюзивное использование памяти, которую это выделило, когда это на самом деле использует его, не, когда это просит его. Это делает выделение быстрым, и могло бы позволить Вам "обманывать" и выделять больше памяти, чем Вы действительно имеете. Однако, после того как процессы начинают использовать эту память, Linux мог бы понять, что это было слишком щедро в выделении памяти, которую это не имеет и должно будет избавиться от процесса для освобождения некоторых. Процесс, который будет уничтожен, основан на времени выполнения принятия во внимание счета (продолжительные процессы более безопасны), использование памяти (жадные процессы менее безопасны), и несколько других факторов, включая значение, которое можно скорректировать для создания процесса менее вероятно, чтобы быть уничтоженными. Это все описано в статье в намного большем количестве деталей.
Править: И вот другая статья, которая объясняет вполне прилично, как процесс выбран (аннотируемый некоторыми примерами кода ядра). Большая вещь об этом состоит в том, что это включает некоторый комментарий относительно обоснования позади различного badness()
правила.