Program terpendek yang terus mengalokasikan memori

49

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.

tbodt
sumber
13
Apakah stack overflow merupakan solusi yang valid? Apakah memori harus bocor atau hanya dialokasikan?
Wheat Wizard
1
@WheatWizard Memori tidak harus bocor, tetapi harus dialokasikan lebih cepat daripada yang dialokasikan.
tbodt
2
Satu kali saya ingin program saya mengkonsumsi memori tak terbatas, saya tidak bisa mendapatkannya. (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.
Carcigenicate
14
Catatan untuk diri sendiri: Simpan kode sebelum pengujian. Memperkenalkan mem-kebocoran mungkin crash IDE ...
steenbergh
1
Saya pikir Anda harus menambahkan tantangan golf lain, serupa tetapi terpisah untuk ini, membutuhkan program mengkonsumsi memori lebih cepat daripada fungsi linear waktu. Untuk tantangan saat ini , perulangan selamanya dan mengalokasikan satu byte harus baik-baik saja. Untuk tantangan baru Anda , itu tidak cukup, tetapi mengulang selamanya dan menggandakan jumlah memori yang digunakan setiap kali akan baik-baik saja.
BenGoldberg

Jawaban:

46

Funge-98 ( cfunge), 1 byte

9

Saya akan memposting ini sebelumnya, tetapi memutuskan untuk mengujinya, dan butuh beberapa saat untuk mengembalikan komputer saya ke status yang dapat digunakan. cfungemenyimpan 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 mendorong 9berulang 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:

"NULL #(4

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). Kemudian Nmencerminkan (tidak memiliki arti secara default), menyebabkan program berjalan mundur. The "berjalan lagi, dan mendorong program untuk stack - sebaliknya saat ini, dengan Ndi atas tumpukan - maka program membungkus di sekitar, memuat perpustakaan dengan nama 4 huruf ( 4(, yang NULLperpustakaan merupakan bagian dari cfungeperpustakaan standar). NULLmendefinisikan semua huruf besar untuk melakukan refleksi, sehingga Lmencerminkan, the#melewatkan beban pustaka dalam perjalanan kembali, 4sampah 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
2
Saya hanya akan menerima ini ...
tbodt
Apakah perlu untuk menjadi 9? Apakah itu juga berfungsi jika itu 5?
tbodt
Apa pun yang mendorong ke stack berfungsi (kecuali mungkin 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 secara 9sewenang-wenang.
22
Tidak dapat menerima karena saya ingin reputasi saya tetap 666.
tbodt
7
@tbodt Bukan alasan sebenarnya untuk tidak menerima. Jika Anda mau, saya akan -1 pertanyaan Anda. Maka ketika Anda menerima, Anda akan memiliki 703 (perhatikan Anda memiliki 703 sekarang, bukan 666).
NoOneIsHere
30

Brainfuck, 5 byte

+[>+]

Ini membutuhkan juru bahasa yang tidak memiliki batasan panjang rekaman.

vsz
sumber
2
Saya cukup yakin itu + [> +] atau kalau tidak itu hanya akan berhenti pada iterasi pertama. ;)
Pâris Douady
Anda benar, maaf atas kesalahan ketiknya.
vsz
40
Salah satu saat langka di mana solusi brainfuck kompetitif ...
FlipTack
@ Flp.Tkc Tapi masih hilang. Mungkin suatu hari akan menang ...
NoOneIsHere
6
@SeeOneRhino: Sudah menang satu kali, mengalahkan semua bahasa golf> codegolf.stackexchange.com/questions/8915/…
vsz
22

Bash + coreutils, 5

atau

Ruby, 5

`yes`

yesmenghasilkan output tanpa akhir. Dimasukkan ke yesdalam 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.

Trauma Digital
sumber
7
Saya akan menulis hal yang sama dan menyebutnya program Ruby.
GB
1
dan perl, saya pikir.
Abligh
18

Python, 16 byte

Tetap bersarang asampai kesalahan tercapai:

a=0
while 1:a=a,

Beberapa iterasi pertama (sebagai tupel) terlihat seperti ini:

0
(0,)
((0,),)
(((0,),),)

dan seterusnya dan seterusnya.

FlipTack
sumber
18

> <> (Ikan), 1 byte

0

Coba di sini!

0 sebenarnya bisa diganti dengan angka heksadesimal 1-f.

Penjelasan

0di> <> cukup membuat kotak kode 1x1 agar ikan bisa berenang. Ini terus-menerus menambahkan 0ke tumpukan, berenang ke kanan, yang dilingkarkan ke belakang 0, menambahkannya ke tumpukan lagi. Ini akan berlangsung selamanya.

redstarcoder
sumber
2
Sekarang saya bertanya-tanya berapa banyak bahasa 2 dimensi lainnya yang berfungsi. Kebanyakan dari mereka adalah berbasis stack.
1
Hampir berfungsi di Cubix , tetapi membutuhkan terkemuka .(atau karakter non-spasi putih) untuk memindahkan 0ke dalam garis eksekusi.
ETHproduksi
1
Bekerja di Ouroboros , tetapi tidak dengan cara yang sama: Penerjemah mencoba membaca 0000000...sebagai bilangan bulat tunggal, dan string yang dibangunnya adalah yang membuat memori terus bertambah. Sebuah program yang berfungsi seperti ini a(mendorong 10 tanpa batas).
DLosc
12

Java 101 byte

class A{public void finalize(){new A();new A();}public static void main(String[]a){for(new A();;);}}

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

masterX244
sumber
yah aku merasa sedikit konyol karena tidak pergi dengan yang sudah jelas sekarang, haha. Saya berani mengatakan ini lebih elegan dari milik saya
Poke
1
ya, kode Anda mengingat saya dengan fakta dengan finalise () @poke
masterX244
Saya pikir Anda bisa membuatnya lebih pendek dengan mengganti main dengan penginisialisasi statis
tbodt
hanya berfungsi hingga java6 dan saya hanya mendapatkan versi yang lebih tinggi
masterX244
2
haha menggunakan pengumpul sampah untuk menyebabkan kebocoran! ide bagus :)
Mark K Cowan
12

Perl, 12 byte

{$"x=9;redo}

Dalam perl, xoperator, dengan string di sebelah kiri dan angka di kanan, menghasilkan string yang berulang. Jadi "abc" x 3dievaluasi 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 redoOperator 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 :).

BenGoldberg
sumber
Anda mengalahkan saya untuk itu! Dan milik Anda tiga byte lebih pendek.
Gabriel Benamy
1
Itu hanya masalah mencari situs web ini untuk loop terkecil :). Juga, saya awalnya memiliki $_.=7di lingkaran saya, tetapi menyadari jika saya bisa menggunakannya x=kehabisan memori jauh lebih cepat, dan kemudian berlari perldoc perlvaruntuk memilih sesuatu yang cocok.
BenGoldberg
{$^O++;redo}lebih pendek satu byte saat ^Osatu chr(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.
Oleg V. Volkov
11

sed, 5 byte

Golf

H;G;D

Penggunaan (input apa pun akan dilakukan)

sed 'H;G;D' <<<""

Dijelaskan

#Append a newline to the contents of the hold space, 
#and then append the contents of the pattern space to that of the hold space.
H

#Append a newline to the contents of the pattern space, 
#and then append the contents of the hold space to that of the pattern space. 
G

#Delete text in the pattern space up to the first newline, 
#and restart cycle with the resultant pattern space.
D

Tangkapan layar

masukkan deskripsi gambar di sini

Cobalah secara Online!

zeppelin
sumber
2
Sebenarnya ini adalah GNU sed (titik koma bukan standar sed) tetapi baris baru akan berfungsi sama baiknya dengan titik koma pula.
R ..
10

Haskell, 23 19 byte

main=print$sum[0..]

Cetak jumlah daftar yang tak terbatas

Angs
sumber
Ini adalah cara yang bagus untuk menegakkan evaluasi, dan juga sangat ringkas. +1
Buah Esolanging
sebuah kompiler dapat menjalankan ini dalam memori O (1) dengan sangat baik. Dalam GHC, sumdidefinisikan sebagai foldl (+) 0, dan apa yang harus menghentikan analisis ketat untuk menendang, untuk mencegah ledakan meledak? Apakah Anda menjalankannya dikompilasi dengan optimasi?
Will Ness
@WillNess Apa jawabannya? sumtidak akan tahu sebelumnya bahwa daftar itu tidak terbatas dan printjumlah itu harus dievaluasi terlebih dahulu. Dan ya, saya mengompilasinya dengan optimisasi
Angs
tidak akan ada jawaban; tetapi perhitungan akan berjalan dalam O (1) ruang. Ups, serang itu, karena standarnya Integer, angkanya tidak terbatas dan memori yang diambil oleh hasil bignum saat ini , memang akan tumbuh.
Will Ness
1
hanya untuk memperjelas, apa yang saya maksudkan adalah bahwa perhitungan sum xs = foldl (+) 0 xscan dapat berjalan dalam stack konstan, seperti yang dilakukan oleh imperative loop . foldl' (+) 0 xspasti akan. Jadi satu-satunya yang mengalokasikan memori untuk pasti, adalah hasil sementara bignum.
Will Ness
9

C ++ (menggunakan kompiler g ++), 27 23 15 byte

Terima 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.

main(){main();}

Solusi alternatif

Solusi ini sebenarnya kebocoran memori.

main(){for(;;new int);}

Valgrind output

Ini adalah output Valgrind setelah menghentikan program beberapa detik dalam waktu berjalan. Anda dapat melihat bahwa itu tentu saja memori yang bocor.

==2582== LEAK SUMMARY:
==2582==    definitely lost: 15,104,008 bytes in 3,776,002 blocks
==2582==    indirectly lost: 0 bytes in 0 blocks
==2582==      possibly lost: 16 bytes in 4 blocks
==2582==    still reachable: 4 bytes in 1 blocks
==2582==         suppressed: 0 bytes in 0 blocks
Wisaya Gandum
sumber
3
Judul itu menyesatkan; pertanyaannya adalah untuk "menulis program yang berjalan selamanya dan terus mengalokasikan memori."
NobodyNada
Oh, saya tidak sadar Anda sudah mengirimkan jawaban ketika saya mengirim jawaban.
Neop
1
@Neop Yah aku tidak tahu kamu bisa mengabaikan int sampai aku melihat milikmu, terima kasih!
Wheat Wizard
2
Tidak C++, hanya dialek g ++ dari itu: C ++ melarang memanggil utama; C ++ membutuhkan int main...deklarasi. Tapi solusinya masih rapi :-)
Martin Ba
1
Memang, C ++ melarang panggilan main.
R ..
9

JAWA, 81 79 78 byte

JAVA (HotSpot) 71 70 byte

Lebih pendek dari jawaban Java lainnya pada saat saya memposting (81, kemudian 79 byte):

class A{public static void main(String[]a){String x="1";for(;;)x+=x.intern();}}

Seperti yang disarankan oleh @Olivier Grégoire, byte lebih lanjut dapat disimpan:

class A{public static void main(String[]a){for(String x="1";;)x+=x.intern();}}

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+=xkarya juga:

class A{public static void main(String[]a){String x="1";for(;;)x+=x;}}

Yang juga dapat memanfaatkan tip @Olivier Grégoire:

class A{public static void main(String[]a){for(String x="1";;)x+=x;}}

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 xtidak pernah lepas dari fungsi lokal. Menggunakan intern()menghindari masalah ini karena string diinternir akhirnya disimpan di bidang statis. Namun, HotSpot memang menghasilkan OutOfMemoryErrorkode untuk itu, jadi saya kira tidak apa-apa.

Pembaruan: @Olivier Gregoire juga menunjukkan bahwa x+=xkode dapat berjalan ke dalam StringIndexOutOfBoundsExceptiondaripada OOMketika banyak memori tersedia. Ini karena Java menggunakan tipe 32-bit intuntuk mengindeks array (dan Strings hanyalah array char). Ini tidak mempengaruhi x+=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.

DepresiDaniel
sumber
Selamat datang di PPCG! Saya tidak terlalu mengenal Java; apa yang akan terjadi jika Anda baru saja melakukannya x+=x;?
ETHproduk
Anda dapat mencukur titik koma dengan meletakkan di x+=x.intern()belakang titik koma terakhir untuk loop
masterX244
Jawaban bagus. Saya tahu pasti ada sesuatu dengan tali interntetapi 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.
Poke
Jika jawaban Anda bergantung pada implementasi Java yang spesifik, dan tidak harus portabel untuk semua implementasi Java, Anda dapat menempatkan informasi dalam judul (mis # 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.
1
humm ... x+=x;tidak menghabiskan seluruh memori. Dengan 64 GB, saya mendapatkan StringIndexOutOfBoundsException, bukan OOM. Dengan .intern()saya masih mendapatkan OOM.
Olivier Grégoire
8

Perl 6 , 13 byte

@= eager 0..*

Penjelasan:

@ = simpan hasilnya ke dalam array tanpa nama

eager buat daftar berikut menjadi bersemangat

0 .. * rentang tak terbatas mulai dari nol

Brad Gilbert b2gills
sumber
8

///, 7 byte

/a/aa/a

Ganti terus-menerus adengan aa, ad nauseum.

steenbergh
sumber
12
*aad naauseum
timothymh
1
* ad nauseam=>aad naauseaam
Aaron
Bagaimana dengan //a/? Itu tampaknya selamanya menggantikan `` (tidak ada) oleh a, tetapi tidak yakin apakah ini ditentukan secara spesifik.
Cedric Reichenbach
6

Python 3, 16 byte

i=9
while 1:i*=i

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).

artificialnull
sumber
Judul menyiratkan bahwa memori harus bocor. Tapi ini sebenarnya tidak membocorkan memori. Penulis mungkin harus mengklarifikasi.
Wheat Wizard
6

Karat, 46 byte

fn main(){loop{std::mem::forget(Box::new(1))}}

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.

Harald Korneliussen
sumber
6

TI-83 Hex Assembly, 7 byte

PROGRAM:M
:AsmPrgm
:EF6A4E
:C3959D
:C9

Membuat appvars tanpa batas waktu sampai ERR:MEMORYdilemparkan oleh OS. Jalankan dengan Asm(prgmM). Saya menghitung setiap pasangan angka hex sebagai satu byte.

Harry
sumber
6

Python, 8 byte

2**9**99

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 adalah

>>> 9**99.
2.9512665430652752e+94

yaitu, 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).

penilai
sumber
5

Jelly , 3 2 byte

-1 byte berkat Dennis ( Wmembungkus)

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 ...

Jonathan Allan
sumber
Kalau saya mengerti aturannya dengan benar, ‘ßharus banyak.
Dennis
Apakah itu benar-benar "terus mengalokasikan memori" (memikirkan Python menjaga alokasi konstan untuk int kecil).
Jonathan Allan
1
Cukup adil. harus tetap sesuai dengan tagihan sekalipun.
Dennis
5

Java 7, 106 byte

class A{public void finalize(){for(;;)Thread.yield();}public static void main(String[]a){for(;;)new A();}}

Kurang Golf

class A{
    @Override
    public void finalize(){
        for(;;) {
            Thread.yield();
        }
    }
    public static void main(String[]a){
        for(;;){
            new A();
        }
    }
}

The finalizemetode 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. Dalam mainloop 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

import sun.misc.*;class A{public static void main(String[]a)throws Exception{java.lang.reflect.Field f=Unsafe.class.getDeclaredField("theUnsafe");f.setAccessible(1>0);for(;;)((Unsafe)f.get(null)).allocateMemory(9);}}

Kurang Golf

import sun.misc.*;
class A{
    public static void main(String[]a)throws Exception{
        java.lang.reflect.Field f=Unsafe.class.getDeclaredField("theUnsafe");
        f.setAccessible(true);
        Unsafe u = (Unsafe)f.get(null);
        for(;;) {
            u.allocateMemory(9);
        }
    }
}

Ini lebih menyenangkan daripada yang lainnya. Jawaban ini memanfaatkan Unsafeperpustakaan Sun yang merupakan API internal tidak berdokumen. Anda mungkin perlu mengubah pengaturan kompiler untuk mengizinkan API terbatas. Unsafe.allocateMemorymengalokasikan 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 menelepon Unsafe.freeMemoryatau sampai jvm kehabisan memori.

Menyodok
sumber
1
Bertanya-tanya apakah saya akan melihat Jawa di sini.
Magic Octopus Urn
Bukankah yang pertama hanya berfungsi jika pengumpul sampah berjalan di utas terpisah?
tbodt
@tbodt ya tapi saya tidak percaya ini tidak pernah terjadi. Pengumpulan sampah terjadi di thread daemon yang disebut pengumpul sampah
Poke
@ Poke apakah itu dijamin? jika tidak jawabannya masih baik, tetapi Anda harus mengklarifikasi bahwa itu hanya berfungsi jika pengumpul sampah berjalan di
utasnya
@tbodt saya pikir begitu tapi saya tidak yakin, jujur.
Poke
5

Haskell, 24 byte

f x=f$x*x
main=pure$!f 9

Masalah utama dalam Haskell adalah untuk mengalahkan kemalasan. mainperlu memiliki beberapa IOjenis, jadi hanya menelepon main=f 9tidak akan berfungsi. Menggunakan main=pure(f 9)mengangkat tipe f 9ke IOtipe. Namun menggunakan konstruksi seperti main=pure 9tidak melakukan apa-apa, 9dikembalikan atau ditampilkan di mana-mana tetapi dibuang begitu saja, sehingga tidak perlu mengevaluasi argumen pure, karenanya main=pure(f 9)tidak menyebabkan memori apa pun dialokasikan sebagaimana ftidak dipanggil. Untuk menegakkan evaluasi, $!operator ada. Itu hanya berlaku fungsi untuk argumen tetapi mengevaluasi argumen terlebih dahulu. Jadi menggunakan main=pure$!f 9mengevaluasi fdan karenanya terus mengalokasikan lebih banyak memori.

Laikoni
sumber
Saat dikompilasi, runtime mendeteksi loop dan
menghentikan
@Angs saya mengkompilasi dengan ghc di windows dan itu dengan senang hati mengalokasikan memori ... Saya berhenti di 3GB.
Laikoni
Menggunakan f x=f xkarya juga, kan? (−2 byte)
wchargin
@wchargin Saya rasa tidak, f x=f xmenghasilkan loop tak terbatas, tetapi tanpa mengalokasikan memori baru.
Laikoni
Bagus, menyebabkan memori meledak oleh perhitungan bignum! f!x=x*f(x*x)harus membuatnya optimalisasi-bukti.
Will Ness
5

dc, 7 byte

[ddx]dx

[ddx]mendorong string yang berisi "ddx" ke stack. dxduplikat 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.

faubi
sumber
Tunggu, jadi ini akan mengalokasikan memori secara eksponensial jika bisa berjalan secara paralel?
HyperNeutrino
5

Haskell (menggunakan ghc 8.0.1), 11 byte

m@main=m>>m

Rekursi non-ekor. mainmenyebut dirinya sendiri lalu kembali lagi.

nimi
sumber
Apakah ini dialokasikan pada heap atau stack? (Saya bisa percaya juga; itu mungkin tergantung pada kompiler Haskell dalam penggunaan.)
1
@ ais523: itu tergantung. Haskell tidak memiliki tumpukan panggilan . Sistem waktu berjalan RTS memiliki area memori untuk pencocokan pola yang juga disebut "tumpukan". Tumpukan ini dialokasikan pada heap. Jujur, saya tidak tahu apa yang terjadi di sini, karena program gagal dengan Stack space overflow: current size 33624 bytes.33k tampaknya cukup rendah berbeda dengan 6G dari total memori yang dilaporkan OS.
nimi
1
@ ais523: sepertinya ada bug dalam informasi memori dari pesan kesalahan ghc, jadi sulit untuk mengatakan apa yang sebenarnya terjadi.
nimi
Dikompilasi pada GHC 7.10.3 di Ubuntu, ini sepertinya membutuhkan jumlah memori yang konstan bahkan ketika optimasi dinonaktifkan
Angs
@ Angs: hmm, saya menggunakan ghc 8.0.1 di MacOS. Saya akan mengedit ini.
nimi
5

C (linux), 23 byte

main(){while(sbrk(9));}

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 dalam VIRTbidang topoutput. 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

main(){while(malloc(9));}

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 oleh malloc()internal.

Trauma Digital
sumber
Dengan malloc, Anda tidak secara langsung menulis di memori karena malloc tidak menginisialisasi apa pun. Memori hanya dialokasikan karena malloc memerlukan beberapa penyimpanan internal untuk mengelola memori. Jadi jawabannya tidak benar-benar standar tetapi saya kira itu bekerja di mana saja.
Antzi
@ Antzi Ya. Namun, saya pikir ini masih berfungsi meskipun karena meskipun memori pengguna mungkin tidak benar-benar dialokasikan sebelum ditulis, setiap malloc()blok ed masih harus memiliki ruang yang dialokasikan nyata sendiri. Ini berfungsi pada macOS dan Ubuntu.
Digital Trauma
Kondisi dalam pertanyaan setiap halaman yang ditulis agak tidak berarti; bahkan jika Anda ingin mengasumsikan OS tidak melakukan akuntansi komit yang tepat, terlepas dari detail implementasi pasti ada jumlah pembukuan yang tidak diperlukan per alokasi. Entah itu bersebelahan dengan alokasi (menyebabkan halaman disentuh) atau tidak, pada akhirnya akan mengkonsumsi jumlah memori sewenang-wenang untuk pembukuan dengan (tentu saja) data yang bukan nol.
R ..
Anda bisa mendapatkannya satu byte lebih kecil dari main(){main(malloc(9));}, tetapi agar tidak menumpuk overflow, itu perlu optimasi panggilan ekor, dan gcc tampaknya tidak ingin melakukan itu pada main...
R ..
Jika Anda mengganti malloc (9) dengan calloc (9,9) maka akan ada cukup memori yang dialokasikan untuk 9 instance dari blok 9-byte (jadi antara 81 dan 144 byte, tergantung pada perataan. Namun, dan yang lebih penting, calloc ( ) akan mengisi nol blok memori, memaksa OS yang mendasari untuk mengalokasikan penyimpanan padanya
CSM
5

Perl, 4 byte

do$0

Jalankan sendiri, dalam juru bahasa saat ini. Setelah selesai, eksekusi kembali ke skrip panggilan, yang membutuhkan tumpukan panggilan.

primo
sumber
Bagus dan pendek, meskipun tidak menghabiskan memori dengan cepat seperti milikku.
BenGoldberg
4

Racket, 13 byte

(let l()(l)1)

Saya tidak sepenuhnya yakin apakah jawaban saya termasuk dalam pertanyaan ini. Tolong beri tahu saya jika saya harus menghapus jawaban ini.

Winny
sumber
Bisakah Anda menjelaskan cara kerjanya?
tbodt
1
oh, jadi itu mendefinisikan lsebagai fungsi yang melakukan rekursi non-tailcall. saya akan mengatakan itu penting.
tbodt
@tbodt ya Anda benar tentang uang
Winny
4

JavaScript 22 21 17 16 15 Bytes

for(a=0;;)a=[a]

Disimpan 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)

f=a=>f([a]);f()
Lmis
sumber
1
Pada contoh kedua Anda dengan ES6, tidak bisakah Anda lakukan f=_=>f();f()? 12 byte
digigit
@Gigit saya tidak yakin. Jika itu penting untuk meniup tumpukan panggilan, maka yang tanpa panggilan ekor yang tepat adalah cara untuk pergi. Dengan TCO, saya pikir tidak akan ada memori yang bocor, kan?
Lmis
keduanya meniup tumpukan panggilan untuk saya . Saya tidak begitu akrab dengan panggilan ekor jadi saya tidak bisa mengomentari itu.
digigit
1
ah saya mengerti, saya tidak yakin bagaimana memori Anda bocor
digigit
1
Anda bisa menghapus a=0. Iterasi pertama akan menghasilkana=[undefined]
Florent
4

Ruby, 11 byte

loop{$*<<9}

Terus mendorong 9ke $*, yang merupakan array awalnya memegang argumen baris perintah untuk proses Ruby.

daniero
sumber
4

05AB1E , 2 byte

[A

Cobalah online! Hanya akan terus mendorong abcdefghijklmnopqrstuvwyxzke tumpukan untuk selamanya.

Semua kemungkinan solusi 2-byte:

[  # Infinite loop.
 A # Push alphabet.
 0 # Push 0.
 1 # Push 1.
 2 # Push 2.
 3 # Push 3.
 4 # Push 4.
 5 # Push 5.
 6 # Push 6.
 7 # Push 7.
 8 # Push 8.
 9 # Push 9.
 T # Push 10.
 X # Push 1.
 Y # Push 2.
 ® # Push -1.
 ¶ # Push \n.
 º # Push len(stack) > 0, so 0 once then 1 for eternity.
 ð # Push a space.
 õ # Push an empty string.
 ¾ # Push 0.
 ¯ # Push [].
 M # Push -inf.
 ) # Wrap current stack in an array.
Guci Gurita Ajaib
sumber
Sangat teliti! Bagus.
timothymh
3

Python, 35 byte

def f(a=[]):a.append(a)
while 1:f()

a tidak pernah dirilis dan semakin besar sampai Anda menekan tombol MemoryError

Anda dapat melihat eksekusi di Python Tutor .

Noelkd
sumber
1
Bisakah kamu melakukannya a+=a,?
Cyoce
Tidak perlu untuk fungsi, inilah golf saya itu
FlipTack
@ Flp.Tkc pertanyaan berubah setelah saya menulis jawaban ini saya akan melakukan apa yang Anda lakukan (+ - beberapa karakter) jika itu dalam format saat ini.
Noelkd
3

TI-BASIC, 8

:Lbl A
:While 1
:Goto A

(semua token 1-byte, dan dua baris baru)

Ini secara terus-menerus membocorkan memori karena aliran kontrol terstruktur seperti Whilediantisipasi ditutup oleh Enddan mendorong sesuatu pada tumpukan (bukan tumpukan OS, tumpukan terpisah di memori tumpukan) untuk melacaknya. Tapi di sini kita gunakan Gotountuk meninggalkan loop (jadi tidak ada Endyang dieksekusi untuk menghapus hal itu dari stack), Whileterlihat lagi, benda itu didorong lagi, dll. Jadi itu terus mendorong mereka sampai Anda mendapatkanERR:MEMORY

Harold
sumber