Ваша задача - создать утечку памяти . Это программа, которая использует много памяти до тех пор, пока у компьютера не кончится нагрузка, и он должен выполнить некоторую подкачку, чтобы спасти себя от нехватки памяти. Единственный способ освободить память - убить программу в диспетчере задач или использовать команду командной строки, например taskkill /im yourprogram /f
(в Windows), или даже перезагрузить компьютер. Простое закрытие приложения не должно мешать ему продолжать загружать память.
Правила:
Любые вилочные бомбы запрещены. Это означает, что печально известная линия Bash
:(){ :|:&};:
запрещена!Приложение должно быть только однопоточным. Это подразумевает правило вилочной бомбы.
Программа не должна запускать другие программы. Это означает, что вы не можете просто сделать что-то подобное
run(memoryfiller.exe)
. Единственное исключение - это программы, которые поставляются в комплекте с вашей ОС или языком, которые не предназначены в первую очередь для потребления памяти (т. Е. Имеют другое назначение). Это значит, что такие вещи какcat
иln -s
разрешены.Вы можете занять столько памяти, сколько захотите. Чем больше, тем лучше.
Код должен быть объяснен полностью.
Удачи. Это конкурс популярности, поэтому выигрывает код, набравший наибольшее количество голосов по истечении 10 дней с даты запроса!
источник
while(1)malloc(999);
?Ответы:
Windows
Win32 API позволяет выделять память в других процессах, а затем удаленно читать / записывать эту память. Эта программа имеет только один поток, который она использует для перечисления каждого запущенного процесса в системе, а затем многократно выделяет 1 МБ буферов в каждом процессе, пока распределение не завершится неудачно. Когда он заканчивается одним процессом, он переходит к следующему. Распределения не освобождаются, когда вызывающая программа заканчивается - только когда / если заканчивается каждый целевой процесс. Это приводит к зависанию виртуальной машины Windows 7 объемом 2 ГБ примерно за 10 секунд. Это требует запуска от имени администратора.
Скомпилировать:
cl /MD leak.cpp /link psapi.lib
источник
Ява
объяснение
Вы можете предположить, что, поскольку в коде нет ссылок (кроме тех
count
, которые вы можете спокойно игнорировать), он не может просочиться. Тем не менее, финализатор создает две новые гидры, и хотя он не содержит ссылок на них, они будут зависать до тех пор, пока не будут завершены. Это означает, что программа выполняет утечку памяти только во время сборки мусора - отсюда и вызовыSystem.gc()
иSystem.runFinalization()
.источник
System.gc()
иSystem.runFinalization()
необходимо? То есть будет ли иногда запускаться gc случайно, или вам придется либо заполнить какую-то память, либо вызвать gc?System.gc()
иSystem.runFinalization()
не было бы необходимости. Сборка мусора происходит естественным образом из-за нехватки памяти. Однако в этом приложении отсутствует нагрузка на память, пока не начнется сбор мусора. Я думал об искусственном введении некоторых (например, перемещаясьnew Hydra()
внутри цикла), но подумал, что это было больше зла.С
Использование языка программирования C и протестировано с ядром Linux 2.6.32-49-generic и libc-2.11.1.so.
Это достигается блокировкой любых сигналов, кроме SIGKILL и SIGSTOP.
Это на самом деле смутило меня ... и его удаление, или закрытие приводит к завершению процесса, позволяя операционной системе вернуть себе любую память, выделенную этому процессу. Но потом я подумал, что закрывая его, вы можете закрыть терминал или любой другой родительский процесс, который выполняет процесс утечки памяти. Если я правильно понял, то решил эту проблему, заблокировав все сигналы, которые превращают процесс в демон, когда родительский процесс завершается. Таким образом, вы можете закрыть терминал, в котором запущен процесс, и он продолжит работу и продолжит утечку памяти.
Процесс не развивается.
Новые темы не создаются.
Новые процессы не создаются.
Столько, сколько может обеспечить операционная система.
Добавлены комментарии к источнику.
И, наконец, вот код:
Для всех, кто интересуется, что произойдет, если вы продолжите работать с этой программой: в моей тестовой системе с 2 ГБ ОЗУ и 4 ГБ подкачки места потребовалось около 10 минут для заполнения ОЗУ и подкачки. Убийца OOM начал свою работу, и через три минуты все процессы были убиты. Даже мышь, клавиатура и дисплей были сброшены системой. /var/log/kern.log не показывает никакой полезной информации, кроме процессов, которые были убиты.
источник
Чистый Баш
Я не обещаю
Он очень похож на вилочную бомбу и использует похожую рекурсивную технику, но без вилок. Конечно, это приведет к запуску вашей оболочки прямо из памяти, поэтому рекомендуется вставить новую оболочку перед вставкой этой команды.
:
$@
удвоенным (список аргументов):
функции функция вызывается с начальным аргументом:
Выход:
В предыдущей редакции этого ответа я это сделал
a=$(yes)
, но заметил правило «Программа не должна запускать другую программу», поэтому мне нужно использовать purebash
вместо вызова coreutils или чего-либо еще.Вот еще один:
ПОЖАЛУЙСТА, НЕ ПРОПУСТИТЕ ЭТО НА ПРОИЗВОДСТВЕННОМ МАШИНЕ
Опять же, это не вилочная бомба - все запускается изнутри. Похоже, что это очень удобно поставить мою Ubuntu VM на колени, с небольшим пространством для восстановления, кроме перезагрузки.
Как и в классической вилочной бомбе, рекурсивная функция
:()
определена. Однако он не раскладывает звонки самому себе. Вместо этого он вызывает себя с одним аргументом, который сам вызывается в подстановке процесса . Поскольку подстановка процессов работает путем открытия файлового дескриптора/dev/fd/n
, это не только израсходует память процесса (bash), но и немного памяти ядра. На моей машине с Ubuntu это приводит к неработоспособности оконного менеджера через несколько секунд, а затем вскоре после появления этого экрана:Нажатие
OK
затем дает этот экран:Похоже, что ни один из этих вариантов не очень помогает - на данный момент перезапуск кажется единственным хорошим вариантом.
источник
$ which yes
->/usr/bin/yes
XML
Затем передайте документ синтаксическому анализатору XML, который не выполняет циклическое / рекурсивное обнаружение ссылки на сущность. Например,
xpath
включено в Perl:Как это устроено:
<boom a="&a;">
"&a;"
в"&b;&b;"
"&b;"
в"&c;&c;"
(по возвращении это расширит другое"&b;"
)"&c;"
etc ...Если бы могло произойти полное расширение, было бы 2 ^ 52 расширение "ka-boom!". Предполагая 2 байта на символ, он попытается использовать 64 ПиБ. Расширение идет "ка-бум!" за один раз, так что вы можете обычно смотреть, как он использует всю память сверху.
Это называется разными именами, хороший обзор здесь: http://projects.webappsec.org/w/page/13247002/XML%20Entity%20Expansion
источник
C ++
Этот код был неожиданным! Он повесил мой компьютер, когда был открыт диспетчер задач, и показал, что он занял 890 Мб памяти за 1 секунду, а затем завис. Я не знаю, как это работает, может быть, он продолжает выделять память для переменной. Чтобы изучить больше этого кода, я добавил оператор,
delete a;
и все было хорошо во время тестирования (без зависаний). Итак, я думаю, что кусок памяти отдано (из-заnew int
) и затем возвращено (из-заdelete a
) в свободное место в новом коде ниже.Итак, я делаю вывод, что ОЗУ В ЭТОМ МИРЕ НЕ МОЖЕТ ОБРАЩАТЬСЯ С ЭТИМ КОДОМ !!!
РЕДАКТИРОВАТЬ : Но многие процессоры могут, например,
intel core 2 duo
не могут обработать этот код, ноintel core i-series
могут (работал для меня ...)Помните, что ответом на вопрос является 1-й код, второй - для объяснения.
источник
new int
даже если вы перезаписали указатель, поэтому вы никогда не сможете получить к нему доступ снова ... Таким образом, сборка мусора не вызывается, и вы заполняете память быстрее, чем толстый ребенок ест кеглиBrainfuck
Объяснение:
Чтобы войти в цикл, он увеличивает ячейку до 1. Он перемещается к следующей ячейке, увеличивая ее до 1, пока последняя ячейка была положительной.
Обычно в интерпретаторе BrainFuck имеется жесткое ограничение количества ячеек на ленте, но некоторые интерпретаторы добавляют ячейки динамически. Они будут продолжать потреблять память, пока она больше не будет потреблять.
beef
это один из таких интерпретаторов, и он доступен в Центре программного обеспечения Ubuntu, и мой текущий запуск на неиспользуемой машине начался 29 часов назад и за это время потребил 1 ГБ ОЗУ. Вот выходtop
Он имеет 4 ГБ кэш-памяти и 6 ГБ подкачки, так что я думаю, что я обновлю этот ответ с тем, как он прошел примерно через 12 дней.
ОБНОВЛЕНИЕ 03.24 17:11
ОБНОВЛЕНИЕ 03.31 00:20
Так что это работает в течение 10 дней. Похоже, он будет работать еще как минимум 10, прежде чем произойдет что-то интересное.
источник
C и POSIX
Здесь я стремлюсь к очень портативному решению. Проблема в том, что чистый C, похоже, не может сказать операционной системе, что память должна оставаться выделенной после закрытия программы. Поэтому я позволю себе использовать POSIX; большинство ОС имеют некоторые претензии на совместимость с POSIX, включая Windows, Linux и MacOS X. Однако я тестировал его только на Ubuntu 12.04 32bit. Не требует прав суперпользователя.
Это решение по сути является традиционным
while(1){malloc(1);}
решением. Однако вместо malloc он использует функции совместно используемой памяти POSIX. Поскольку он назначает идентификатор общей памяти каждому выделению, все еще возможно получить доступ к памяти, как только процесс завершается. Таким образом, ядро не может освободить память.источник
C #
Если вы забудете отписаться от событий до того, как обработчик выйдет из области видимости, .NET вызовет утечку памяти, пока не возникнет исключение OutOfMemoryException.
Объяснение : Внутри
while
цикла мы создаем новый объект, заставляя каркас выделять больше памяти, но мы также предотвращаемB
освобождение нового экземпляра , когда он выходит из области видимости, назначая метод экземпляра событию в другом классе, в результате новый экземплярB
становится недоступным из нашего кода, но ссылка все еще существует, то есть GC не выпустит его, покаa
также не выйдет из области видимости.Статические события имеют одну и ту же ловушку, так как они никогда не выходят за рамки, они очищаются только после завершения процесса, если вы сначала не отмените подписку на событие. Всегда храните ваши отзывы, люди!
Вышеприведенное работает по той же идее, обработчик становится недоступным, как только
while
цикл выходит из области видимости, что делает невозможным отписаться от события, то есть память будет находиться там до завершения программы. Статические события, возможно, более опасны, чем события экземпляра, потому что вы можете быть уверены, что они никогда не выйдут за рамки.РЕДАКТИРОВАТЬ : Вы также можете сделать то же самое с любым другим объектом, если вы добавляете ссылку, в то же время гарантируя, что нет никакой возможности освободить эту ссылку.
Вот пример, который использует статические объекты и массивы.
Массивы продолжают добавляться в список, но нет способа очистить список без изменения кода, что было бы невозможно для приложений с закрытым исходным кодом. Увеличение передаваемого числа
Leak.Add
вызовет более быструю утечку, если вы установите его достаточно высоко, это вызовет немедленное возникновение исключения OverflowException.источник
bash (без внешних утилит)
Здесь нет вилочной бомбы.
Предупреждение: это может убить вашу оболочку.
Просто пытаюсь создать массив целых чисел для справки, потому что я постоянно забываю, как выглядят целые числа.
Результаты в:
источник
J (7)
ВНИМАНИЕ: Это заморозило мою систему, когда я попробовал ее (Windows 8, J 8.01, в терминале qt).
2#
удваивает длину аргумента, дублируя каждый элемент,^:_
находит точку фиксации данной функции (но ее нет, поэтому она зацикливается бесконечно),[_
называет это_
как аргумент.источник
Хаскелл (номер Грэма)
Это очень просто: это вычисляет число Грэма
В отличие от других примеров здесь, он не будет работать вечно ... он будет использовать много процессоров, но теоретически он может завершиться. если бы не тот факт, что хранить номер ...
(согласно википедии)
Таким образом, идея заключается в том, что память будет использоваться (серией все более и более) огромных
Integer
(s) (целые числа Хаскелла имеют произвольный размер).Если вы хотите проверить это, вам, возможно, придется увеличить размер стека или загрузить его внутрь
ghci
.источник
Вдохновленный @comintern.
Замена / dev / null. Включение подлого режима. Требуются заголовки ядра, режим суперпользователя и работающий компилятор.
Веселиться.
Makefile:
Исходный код:
Предупреждение это может заставить вас перезагрузиться!
Чтобы удалить это:
источник
Рубин
Всем известно, что сумма (1 / n ^ 2) = pi ^ 2/6
Таким образом, я могу определить функцию приближения:
Конечно (1..infinity) станет диким.
Однако обратите внимание, что использование lazy сделает эту работу;)
источник
C -
2825 символов (полная программа)Не запускайте его, иначе ваша система быстро зависнет!
При вызове malloc резервируется 9 байт памяти и регулярно запрашиваются новые страницы памяти у операционной системы. Память, выделенная функцией malloc, немедленно просачивается, поскольку указатель на возвращаемый адрес не сохраняется. Как только система исчерпает память (ОЗУ и пространство подкачки) или будет достигнут предел памяти для процесса, программа выйдет из цикла while и завершит работу.
источник
main(){while(malloc(9));}
сохраняет еще 3 символа и заполняет мою память практически мгновенно.VBScript
Мы создаем дичионар, который указывает на себя. Затем мы думаем, что уничтожаем словарь, устанавливая его в Nothing. Тем не менее, словарь все еще существует в памяти, потому что он имеет действительную (круговую) ссылку.
Цикл, а также память, заставляет программу зависать. После выключения программы память все еще используется. Система может быть восстановлена только после ее перезапуска.
источник
Да и tmpfs
Зачем писать новую программу, если вы приходите бесплатно с Ubuntu?
Как вы, наверное, знаете или уже догадались, Ubuntu по умолчанию монтирует / run / user / как tmpfs, который является типом RAM-диска .
Вам даже не нужно закрывать это. Он будет вежливо закрываться, оставляя хороший кусок памяти. Я предполагаю,
yes
что это однопоточная, однопроцессная программа, которая не вызывает никаких других (запись на существующий RAM-диск также легко переносится на язык по вашему выбору).В ней есть небольшая ошибка: Ubuntu по умолчанию ограничивает доступную для записи tmpfs / run / 1000 до 100 МБ, поэтому функция смерти свопинга может не поддерживаться на вашем компьютере из коробки. Однако мне удалось исправить это на моей машине следующим быстрым решением:
источник
/run/user
каталога вообще. Какую версию Ubuntu вы используете и что для этого установили?tmpfs
файловые системы, вы можете перечислить их с помощьюdf -t tmpfs
. У моей системы Ubuntu есть прекрасный большой/run/shm
доступный ...удар
Предупреждение: следующий код сделает ваш компьютер не загружаемым.
Предупреждение: предыдущий код сделает ваш компьютер не загружаемым.
Замените / dev / sda загрузочным диском. Это пишет E8 FD FF в начало вашего загрузочного сектора. При загрузке BIOS считывает ваш загрузочный сектор в память и выполняет его. Эти коды операций эквивалентны этой сборке:
Это бесконечная рекурсия, которая в конечном итоге приведет к переполнению стека.
источник
jmp
вместоcall
Haskell
Это пытается сложить счетные числа. Haskell вычисляет частичные суммы, он просто становится бесконечным оператором сложения. Если вы запустите компилятор с флагами оптимизации, он может не работать.
источник
удар
Так как мы можем использовать утилиты, специально не предназначенные для потребления памяти, я остановлюсь на полезность для свободной памяти:
swapon
. Это используется, чтобы позволить ядру освободить память путем записи на диск.Этот скрипт выполняет две оптимизации: (1) монтирование tmp как tmpfs (тип RAM-диска) для ускорения / tmp и (2) создание файла подкачки для освобождения памяти. Каждый из них разумен сам по себе, но если неосторожный пользователь делает и то, и другое, он устанавливает цикл обмена: когда ОС пытается выгружать страницы, она записывает в tmpfs; это заставляет tmpfs использовать больше памяти; это увеличивает нагрузку на память, вызывая замену большего количества страниц. На моей виртуальной машине это может занять несколько минут, и у вас будет достаточно времени, чтобы увидеть, как система копается в яме
top
.Закрытие программы не имеет большого значения, так как сама программа почти не выделяет памяти. Действительно, освободить память не так просто, поскольку вы не можете освободить память, размонтировав tmpfs перед вашим
swapoff
файлом подкачки, и это трудно сделать, пока вы не освободите память.Этот ответ можно рассматривать как предостерегающую историю против ослепления, применяя прикольные трюки из сети, не понимая их.
источник
Perl
Использует циклические ссылки. Счетчик ссылок для переменных никогда не достигнет 0, и ссылки никогда не будут собираться мусором.
Возможно, вам нужно набраться терпения, но это гарантированно душит вашу систему. Диск начнет вращаться быстрее и могут быть видны пары.
источник
PHP (только Linux):
Этот код не проверен, так как у меня нет компьютера с Linux, на котором работает php.
Но это мое доказательство концепции:
Это заполнит память огромными изображениями RGBA (10000x10000 пикселей).
Единственный способ отключить этого ребенка - отключить питание.
Код все прокомментирован.
Любое улучшение, сомнение, ошибка или что-то еще, используйте поле для комментариев ниже.
источник
Python - 56
Создает класс, определяет метод для установки атрибутов, устанавливает в нем атрибут и создает начальный экземпляр, для которого он затем пытается установить атрибут.
Простая рекурсивная функция (
def f(x):f(x)
) казалась немного невообразимой, поэтому я решил никогда не вызывать функцию.Управление памятью может улавливать глубину рекурсии, но это действительно зависит от реализации.
Если это вилочная бомба, пожалуйста, скажите мне.
источник
RuntimeError: maximum recursion depth exceeded while calling a Python object
. Даже установка максимального предела рекурсииsys.setrecursionlimit
без использования памяти используется до того, как произойдет сбой из-за ошибки сегментации.Perl
Это просто, но я чувствовал, что играю в гольф.
После двух итераций
$x
содержит ссылку на массив, содержащий ссылку на массив, содержащийundef
.Использование памяти линейно во времени, с небольшими распределениями, но потребовалось всего несколько секунд, чтобы сильно замедлить мой оконный менеджер в моей системе Ubuntu Linux. Через полминуты об этом позаботился убийца ООМ.
источник
ECMAScript 6:
Ungolfed:
Примечание: он использует
setTimeout
, который определяется как часть таймеров - HTML Living Standard .Попробуйте это на Mozilla Firefox (вы можете вставить его в консоль разработчика). Firefox продолжает поглощать все больше и больше памяти и использует
100%
процессор на одноядерном компьютере (на 4-ядерном компьютере, таком как мой, он использует25%
процессор). Это также имеет дополнительное преимущество, что вы не можете остановить его; если вы можете открыть диспетчер задач, вы можете убить Firefox с его помощью.источник
удар
Создать пустой файл
test
Заменить
/dev/null/
этим текстовым файлом$ sudo mv test /dev/null
Это работает аналогично ответу @ Comintern. Все выходные данные
/dev/null
теперь будут добавлены в этот текстовый файл, который со временем станет огромным и приведет к краху системы.источник
/dev
естьdevtmpfs
, он может заполнить и помешать системе. Я предполагаю, что цель этого ответа.Баш: 7 символов
Это должно быть самое простое решение для bash. Нет вилок, нет обмана.
Вам не рекомендуется запускать это как root.
источник
unset
переменной, память останется выделенной, пока оболочка не будет уничтожена. Вы можете посмотреть бойнюtop
.unset x
освобождает память. pdksh также освобождает память, но ksh93 не может освободить ее, аexit
в ksh93 сбрасывает ядро.yes
будет уничтожено, и в этот момент он просто остается там, неunset
имея никакого эффекта. Но это в большой системе памяти, и наличие переменной, которая составляет несколько гигабайт, похоже, не беспокоит ее (пока она, наконец, не решит убить оболочку).С
Ну, это занимает память страницу за страницей и, наконец, не осталось памяти.
источник
Рубин
Он просто бесконечно добавляет (рекурсивно!) Самостоятельные ссылки на себя.
Узнал об этом маленьком драгоценном камне, когда кто-то сломал мою песочницу Ruby . : D
Демонстрация рекурсивных аспектов этого:
источник
C ++ 79
Non-golfed
Я исправил свою запись, чтобы включить звонок с главной.
источник