Tulis program yang berjalan selamanya dan alokasikan lebih banyak memori pada heap, semakin lama berjalan, setidaknya sampai Anda mencapai batas sistem operasi pada jumlah memori yang dapat dialokasikan.
Banyak kernel tidak akan mencadangkan memori yang Anda alokasikan sampai Anda menggunakannya untuk sesuatu, jadi jika program Anda menggunakan bahasa C atau bahasa tingkat rendah lainnya, Anda harus memastikan Anda menulis sesuatu untuk setiap halaman. Jika Anda menggunakan bahasa yang ditafsirkan, Anda mungkin tidak perlu khawatir tentang ini.
Kode terpendek menang.
(reduce conj [] (range))
(Clojure) mencapai 737mb, lalu berhenti tumbuh. Idk bagaimana itu tidak terus naik. Itu "berpikir" Aku ingin mencetak seluruh daftar di akhir, jadi itu tidak akan membuang apa pun. Sangat membuat frustrasi.Jawaban:
Funge-98 (
cfunge
), 1 byteSaya akan memposting ini sebelumnya, tetapi memutuskan untuk mengujinya, dan butuh beberapa saat untuk mengembalikan komputer saya ke status yang dapat digunakan.
cfunge
menyimpan tumpukan Funge pada tumpukan sistem operasi (yang mudah diverifikasi dengan menjalankan program dengan batas memori kecil, sesuatu yang seharusnya saya lakukan sebelumnya!), sehingga tumpukan yang tumbuh tanpa batas (seperti dengan program ini, yang hanya mendorong9
berulang kali; Program Funge yang dibungkus dari ujung garis kembali ke awal secara default) akan mengalokasikan memori selamanya. Program ini kemungkinan juga bekerja di beberapa implementasi Befunge-93.Lebih menarik:
Ini adalah ide pertama saya, dan merupakan alokasi tak terbatas yang tidak bergantung pada tumpukan Funge (meskipun tumpukan Funge juga meledak). Untuk mulai dengan,
"
perintah mendorong salinan sisa program ke stack (itu adalah string, dan program membungkus, sehingga kutipan tutup juga berfungsi sebagai kutipan terbuka). KemudianN
mencerminkan (tidak memiliki arti secara default), menyebabkan program berjalan mundur. The"
berjalan lagi, dan mendorong program untuk stack - sebaliknya saat ini, denganN
di atas tumpukan - maka program membungkus di sekitar, memuat perpustakaan dengan nama 4 huruf (4(
, yangNULL
perpustakaan merupakan bagian daricfunge
perpustakaan standar).NULL
mendefinisikan semua huruf besar untuk melakukan refleksi, sehinggaL
mencerminkan, the#
melewatkan beban pustaka dalam perjalanan kembali,4
sampah yang tidak kita pedulikan ke stack dan seluruh program mengulangi dari awal. Mengingat bahwa memuat pustaka beberapa kali memiliki efek, dan mengharuskan daftar perintah pustaka untuk disimpan satu kali untuk setiap salinan pustaka (ini tersirat oleh semantik Funge-98), itu bocor memori melalui penyimpanan non-stack (yang merupakan metode alternatif mendefinisikan "heap", relatif terhadap bahasa daripada OS).sumber
0
; ada kemungkinan bahwa implementasi Funge atau OS dapat menemukan cara untuk mengoptimalkannya, mengingat bahwa memori yang dimaksud sudah penuh dengan angka nol). Saya hanya memilih secara9
sewenang-wenang.Brainfuck, 5 byte
Ini membutuhkan juru bahasa yang tidak memiliki batasan panjang rekaman.
sumber
Bash + coreutils, 5
atau
Ruby, 5
yes
menghasilkan output tanpa akhir. Dimasukkan keyes
dalam backticks memberitahu shell untuk menangkap semua output dan kemudian jalankan output itu sebagai perintah. Bash akan terus mengalokasikan memori untuk string tanpa akhir ini hingga tumpukan habis. Tentu saja output yang dihasilkan akan berakhir menjadi perintah yang tidak valid, tetapi kita harus kehabisan memori sebelum itu terjadi.Terima kasih kepada @GB untuk menunjukkan ini juga polyglot di ruby.
sumber
Python, 16 byte
Tetap bersarang
a
sampai kesalahan tercapai:Beberapa iterasi pertama (sebagai tupel) terlihat seperti ini:
dan seterusnya dan seterusnya.
sumber
> <> (Ikan), 1 byte
Coba di sini!
0
sebenarnya bisa diganti dengan angka heksadesimal 1-f.Penjelasan
0
di> <> cukup membuat kotak kode 1x1 agar ikan bisa berenang. Ini terus-menerus menambahkan0
ke tumpukan, berenang ke kanan, yang dilingkarkan ke belakang0
, menambahkannya ke tumpukan lagi. Ini akan berlangsung selamanya.sumber
.
(atau karakter non-spasi putih) untuk memindahkan0
ke dalam garis eksekusi.0000000...
sebagai bilangan bulat tunggal, dan string yang dibangunnya adalah yang membuat memori terus bertambah. Sebuah program yang berfungsi seperti inia
(mendorong 10 tanpa batas).Java 101 byte
Menangkap Program utama dalam Loop tanpa akhir setelah membuat dan membuang objek. Pengumpulan sampah melakukan pekerjaan bocor dengan membuat 2 objek untuk setiap yang dihapus
sumber
Perl, 12 byte
Dalam perl,
x
operator, dengan string di sebelah kiri dan angka di kanan, menghasilkan string yang berulang. Jadi"abc" x 3
dievaluasi untuk"abcabcabc"
.The
x=
Operator bermutasi argumen kiri, menggantikan isi dari variabel di sebelah kiri dengan hasil mengulangi isi itu sebanyak sisi kanan menunjukkan.Perl memiliki sejumlah variabel bawaan yang dinamai aneh, salah satunya adalah
$"
, yang nilai awalnya adalah ruang tunggal.The
redo
Operator melompat ke awal melampirkan tersebut{}
.Pertama kali
x=
operator selesai, ia mengubah nilai$"
dari" "
"menjadi" "
, yaitu 9 spasi.Kali kedua
x=
operator selesai, ia mengubah nilai$"
menjadi" "
, yaitu 81 spasi.Ketiga kalinya,
$"
menjadi string ruang panjang 729 byte.Saya pikir Anda bisa melihat ke mana arahnya ini :).
sumber
$_.=7
di lingkaran saya, tetapi menyadari jika saya bisa menggunakannyax=
kehabisan memori jauh lebih cepat, dan kemudian berlariperldoc perlvar
untuk memilih sesuatu yang cocok.{$^O++;redo}
lebih pendek satu byte saat^O
satuchr(15)
byte. Meskipun itu akan membuang memori pada tingkat JAUH lebih lambat - diperlukan 1000000000 iterasi pada Windows untuk membuang satu byte. Akan bekerja pada OS apa pun yang namanya dimulai dengan huruf Latin.sed, 5 byte
Golf
Penggunaan (input apa pun akan dilakukan)
Dijelaskan
Tangkapan layar
Cobalah secara Online!
sumber
Haskell,
2319 byteCetak jumlah daftar yang tak terbatas
sumber
sum
didefinisikan sebagaifoldl (+) 0
, dan apa yang harus menghentikan analisis ketat untuk menendang, untuk mencegah ledakan meledak? Apakah Anda menjalankannya dikompilasi dengan optimasi?sum
tidak akan tahu sebelumnya bahwa daftar itu tidak terbatas danprint
jumlah itu harus dievaluasi terlebih dahulu. Dan ya, saya mengompilasinya dengan optimisasiInteger
, angkanya tidak terbatas dan memori yang diambil oleh hasil bignum saat ini , memang akan tumbuh.sum xs = foldl (+) 0 xs
can dapat berjalan dalam stack konstan, seperti yang dilakukan oleh imperative loop .foldl' (+) 0 xs
pasti akan. Jadi satu-satunya yang mengalokasikan memori untuk pasti, adalah hasil sementara bignum.C ++ (menggunakan kompiler g ++),
272315 byteTerima kasih kepada Neop untuk membantu saya menghapus 4 byte
Solusi ini tidak benar-benar membocorkan memori apa pun karena ia mengalokasikan semua yang ada di stack dan dengan demikian menyebabkan stack overflow. Itu hanya rekursif tanpa batas. Setiap rekursi menyebabkan sebagian memori dialokasikan hingga stack meluap.
Solusi alternatif
Solusi ini sebenarnya kebocoran memori.
Valgrind output
Ini adalah output Valgrind setelah menghentikan program beberapa detik dalam waktu berjalan. Anda dapat melihat bahwa itu tentu saja memori yang bocor.
sumber
int
sampai aku melihat milikmu, terima kasih!C++
, hanya dialek g ++ dari itu: C ++ melarang memanggil utama; C ++ membutuhkanint main...
deklarasi. Tapi solusinya masih rapi :-)main
.JAWA,
817978 byteJAVA (HotSpot)
7170 byteLebih pendek dari jawaban Java lainnya pada saat saya memposting (81, kemudian 79 byte):
Seperti yang disarankan oleh @Olivier Grégoire, byte lebih lanjut dapat disimpan:
Menempatkan
x+=x.intern()
sebagai kenaikan for loop tidak akan membantu apa pun, karena titik koma masih diperlukan untuk mengakhiri pernyataan for.Seperti yang disarankan oleh @ETHproductions, hanya menggunakan
x+=x
karya juga:Yang juga dapat memanfaatkan tip @Olivier Grégoire:
Satu-satunya keraguan saya tentang hal itu adalah bahwa tidak dijamin untuk mengalokasikan data pada heap , karena JVM yang efisien dapat dengan mudah menyadari bahwa
x
tidak pernah lepas dari fungsi lokal. Menggunakanintern()
menghindari masalah ini karena string diinternir akhirnya disimpan di bidang statis. Namun, HotSpot memang menghasilkanOutOfMemoryError
kode untuk itu, jadi saya kira tidak apa-apa.Pembaruan: @Olivier Gregoire juga menunjukkan bahwa
x+=x
kode dapat berjalan ke dalamStringIndexOutOfBoundsException
daripadaOOM
ketika banyak memori tersedia. Ini karena Java menggunakan tipe 32-bitint
untuk mengindeks array (dan Strings hanyalah arraychar
). Ini tidak mempengaruhix+=x.intern()
solusi karena memori yang diperlukan untuk yang terakhir adalah kuadrat dalam panjang string, dan karenanya harus ditingkatkan menjadi urutan 2 ^ 62 byte yang dialokasikan.sumber
x+=x;
?x+=x.intern()
belakang titik koma terakhir untuk loopintern
tetapi saya cukup senang dengan Unsafe dan akhirnya saya berhenti melihat, haha. Awalnya pertanyaan ini menentukan "kebocoran memori" yang mengapa saya tidak hanya melakukan string concat answer.# Java (HotSpot), 71 bytes
.). Dengan begitu, Anda tidak perlu khawatir tentang solusi yang berpotensi curang; program implementasi tertentu adalah umum tidak hanya dalam bermain golf, tetapi juga di dunia pemrograman yang lebih luas, dan selama Anda mengetahui apa yang Anda lakukan terkadang lebih tepat daripada program portabel untuk, katakanlah, program dari naskah.x+=x;
tidak menghabiskan seluruh memori. Dengan 64 GB, saya mendapatkanStringIndexOutOfBoundsException
, bukan OOM. Dengan.intern()
saya masih mendapatkan OOM.Perl 6 , 13 byte
Penjelasan:
@ =
simpan hasilnya ke dalam array tanpa namaeager
buat daftar berikut menjadi bersemangat0 .. *
rentang tak terbatas mulai dari nolsumber
///, 7 byte
Ganti terus-menerus
a
denganaa
, ad nauseum.sumber
aad naauseum
ad nauseam
=>aad naauseaam
//a/
? Itu tampaknya selamanya menggantikan `` (tidak ada) oleha
, tetapi tidak yakin apakah ini ditentukan secara spesifik.Python 3, 16 byte
Ini berasal dari kenyataan bahwa tidak ada batasan untuk ukuran integer di Python 3; sebagai gantinya, bilangan bulat dapat mengambil memori sebanyak yang dapat ditangani oleh sistem (jika sesuatu tentang pemahaman saya tentang hal ini salah, lakukan koreksi pada saya).
sumber
Karat, 46 byte
Perhatikan sesuatu yang menarik tentang program Rust ini, bocornya alokasi tumpukan hingga kehabisan memori?
Itu benar, tidak ada blok yang tidak aman. Karat menjamin keamanan memori dalam kode aman (tidak ada pembacaan data yang tidak diinisialisasi, baca setelah bebas, ganda gratis dll), tetapi kebocoran memori dianggap sangat aman. Bahkan ada fungsi eksplisit untuk membuat kompiler lupa tentang pembersihan RAII dari variabel luar ruang lingkup, yang saya gunakan di sini.
sumber
TI-83 Hex Assembly, 7 byte
Membuat appvars tanpa batas waktu sampai
ERR:MEMORY
dilemparkan oleh OS. Jalankan denganAsm(prgmM)
. Saya menghitung setiap pasangan angka hex sebagai satu byte.sumber
Python, 8 byte
The OP telah memungkinkan teknis dari sebuah program yang tidak secara teknis menjalankan "selamanya", tapi mengalokasikan memori lebih dari komputer manapun mungkin bisa menangani. Ini bukan googolplex (artinya
10**10**100
, 11 byte), tetapi secara naif, basis log 2 dari nomor tersebut adalahyaitu, 10 ^ 94 bit untuk mewakilinya. WolframAlpha menyatakan bahwa 10 ^ 76 lebih besar dari jaring dalam (ingatlah bahwa ada sekitar 10 ^ 80 atom di alam semesta ).
Mengapa 2 bukannya 9 yang Anda tanyakan? Itu tidak membuat banyak perbedaan (menggunakan 9 hanya akan meningkatkan jumlah bit dengan faktor
log2(9) = 3.2
, yang bahkan tidak mengubah eksponen). Tetapi di sisi lain, program ini berjalan lebih cepat dengan 2, karena perhitungannya lebih sederhana. Ini berarti memori langsung terisi, tidak seperti versi 9, yang membutuhkan waktu lebih lama karena perhitungan yang diperlukan. Tidak perlu, tetapi baik jika Anda ingin "menguji" ini (yang saya lakukan).sumber
Jelly ,
32 byte-1 byte berkat Dennis (
W
membungkus)Tautan (yaitu fungsi atau metode), yang juga berfungsi sebagai program lengkap, yang secara rekursif memasukkan inputnya ke dalam daftar.
Input dimulai sebagai nol sehingga pass pertama menciptakan daftar
[0]
Pass kedua kemudian membuat ini
[[0]]
Pass ketiga kemudian membuat ini
[[[0]]]
dan seterusnya ...
3 byter sebelumnya, yang bocor jauh lebih cepat:
secara rekursif menggabungkan semua sublist yang berdekatan yang tidak kosong dari inputnya ke inputnya.
[0]
->[0,[0]]
->[0,[0],[0],[[0]],[0,[0]]]
dan seterusnya ...sumber
‘ß
harus banyak.Wß
harus tetap sesuai dengan tagihan sekalipun.Java 7, 106 byte
Kurang Golf
The
finalize
metode ini disebut pada objek oleh kolektor sampah ketika pengumpulan sampah menentukan bahwa tidak ada lagi referensi ke objek. Saya hanya mendefinisikan ulang metode ini untuk mengulang selamanya sehingga pengumpul sampah tidak pernah benar-benar membebaskan memori. Dalammain
loop saya membuat objek baru yang tidak akan pernah dibersihkan sehingga pada akhirnya ini akan menggunakan semua memori yang tersedia.Java 7 (alternatif yang menyenangkan), 216 byte
Kurang Golf
Ini lebih menyenangkan daripada yang lainnya. Jawaban ini memanfaatkan
Unsafe
perpustakaan Sun yang merupakan API internal tidak berdokumen. Anda mungkin perlu mengubah pengaturan kompiler untuk mengizinkan API terbatas.Unsafe.allocateMemory
mengalokasikan jumlah byte tertentu (tanpa pemeriksaan batas) yang tidak ada di heap dan tidak di bawah manajemen pengumpul sampah java sehingga memori ini akan bertahan sampai Anda meneleponUnsafe.freeMemory
atau sampai jvm kehabisan memori.sumber
Haskell, 24 byte
Masalah utama dalam Haskell adalah untuk mengalahkan kemalasan.
main
perlu memiliki beberapaIO
jenis, jadi hanya meneleponmain=f 9
tidak akan berfungsi. Menggunakanmain=pure(f 9)
mengangkat tipef 9
keIO
tipe. Namun menggunakan konstruksi sepertimain=pure 9
tidak melakukan apa-apa,9
dikembalikan atau ditampilkan di mana-mana tetapi dibuang begitu saja, sehingga tidak perlu mengevaluasi argumenpure
, karenanyamain=pure(f 9)
tidak menyebabkan memori apa pun dialokasikan sebagaimanaf
tidak dipanggil. Untuk menegakkan evaluasi,$!
operator ada. Itu hanya berlaku fungsi untuk argumen tetapi mengevaluasi argumen terlebih dahulu. Jadi menggunakanmain=pure$!f 9
mengevaluasif
dan karenanya terus mengalokasikan lebih banyak memori.sumber
f x=f x
karya juga, kan? (−2 byte)f x=f x
menghasilkan loop tak terbatas, tetapi tanpa mengalokasikan memori baru.f!x=x*f(x*x)
harus membuatnya optimalisasi-bukti.dc, 7 byte
[ddx]
mendorong string yang berisi "ddx" ke stack.dx
duplikat lalu jalankan sebagai kode (meninggalkan satu salinan di tumpukan). Ketika dieksekusi, itu membuat dua duplikat kemudian mengeksekusi satu, meninggalkan satu salinan lagi di stack setiap kali.sumber
Haskell (menggunakan ghc 8.0.1), 11 byte
Rekursi non-ekor.
main
menyebut dirinya sendiri lalu kembali lagi.sumber
Stack space overflow: current size 33624 bytes.
33k tampaknya cukup rendah berbeda dengan 6G dari total memori yang dilaporkan OS.C (linux), 23 byte
sbrk()
menambah bagian atas segmen data dengan jumlah byte yang diberikan, sehingga secara efektif meningkatkan jumlah memori yang dialokasikan untuk program - setidaknya seperti yang dilaporkan dalamVIRT
bidangtop
output. Ini hanya bekerja di Linux - implementasi macOS tampaknya merupakan emulasi yang hanya memungkinkan alokasi hingga 4MB.Jadi jawaban yang sedikit lebih umum:
C, 25 byte
Saya menontonnya di Monitor Aktivitas macOS. Semua berjalan hingga sekitar 48GB, kemudian pada akhirnya proses tersebut menerima sinyal SIGKILL. FWIW macbook pro saya memiliki 16GB. Sebagian besar memori yang digunakan dilaporkan sebagai terkompresi.
Perhatikan bahwa pertanyaan ini secara efektif mengharuskan setiap alokasi ditulis, yang tidak terjadi secara eksplisit di sini. Namun penting untuk dicatat bahwa untuk setiap
malloc(9)
panggilan, bukan hanya 9 byte yang diminta pengguna yang dialokasikan. Untuk setiap blok yang dialokasikan akan ada header malloc yang juga dialokasikan dari suatu tempat di heap, yang harus ditulis olehmalloc()
internal.sumber
malloc()
blok ed masih harus memiliki ruang yang dialokasikan nyata sendiri. Ini berfungsi pada macOS dan Ubuntu.main(){main(malloc(9));}
, tetapi agar tidak menumpuk overflow, itu perlu optimasi panggilan ekor, dan gcc tampaknya tidak ingin melakukan itu padamain
...Perl, 4 byte
Jalankan sendiri, dalam juru bahasa saat ini. Setelah selesai, eksekusi kembali ke skrip panggilan, yang membutuhkan tumpukan panggilan.
sumber
Racket, 13 byte
Saya tidak sepenuhnya yakin apakah jawaban saya termasuk dalam pertanyaan ini. Tolong beri tahu saya jika saya harus menghapus jawaban ini.
sumber
l
sebagai fungsi yang melakukan rekursi non-tailcall. saya akan mengatakan itu penting.JavaScript
2221171615 BytesDisimpan 4 byte dengan membungkus daftar di daftar lain seperti pada jawaban Jelly @ Jonathan Jon.
Disimpan 1 byte berkat @ETHProductions
Solusi alternatif 15 Bytes (hanya berfungsi dengan panggilan ekor yang tepat)
sumber
f=_=>f();f()
? 12 bytea=0
. Iterasi pertama akan menghasilkana=[undefined]
Ruby, 11 byte
Terus mendorong
9
ke$*
, yang merupakan array awalnya memegang argumen baris perintah untuk proses Ruby.sumber
05AB1E , 2 byte
Cobalah online! Hanya akan terus mendorong
abcdefghijklmnopqrstuvwyxz
ke tumpukan untuk selamanya.Semua kemungkinan solusi 2-byte:
sumber
Python, 35 byte
a
tidak pernah dirilis dan semakin besar sampai Anda menekan tombolMemoryError
Anda dapat melihat eksekusi di Python Tutor .
sumber
a+=a,
?TI-BASIC, 8
(semua token 1-byte, dan dua baris baru)
Ini secara terus-menerus membocorkan memori karena aliran kontrol terstruktur seperti
While
diantisipasi ditutup olehEnd
dan mendorong sesuatu pada tumpukan (bukan tumpukan OS, tumpukan terpisah di memori tumpukan) untuk melacaknya. Tapi di sini kita gunakanGoto
untuk meninggalkan loop (jadi tidak adaEnd
yang dieksekusi untuk menghapus hal itu dari stack),While
terlihat lagi, benda itu didorong lagi, dll. Jadi itu terus mendorong mereka sampai Anda mendapatkanERR:MEMORY
sumber