지속적으로 메모리를 할당하는 가장 짧은 프로그램


49

최소한 실행할 수있는 메모리 양에서 운영 체제 한계에 도달 할 때까지 영원히 실행되고 힙에 더 많은 메모리를 할당하는 프로그램을 작성하십시오.

많은 커널은 실제로 무언가를 사용할 때까지 할당 한 메모리를 예약하지 않으므로 프로그램이 C 또는 다른 저수준 언어 인 경우 각 페이지에 무언가를 작성해야합니다. 통역 언어를 사용하는 경우에는 걱정할 필요가 없습니다.

가장 짧은 코드가 승리합니다.


13
스택 오버플로가 유효한 솔루션입니까? 메모리가 누출되거나 방금 할당되어야합니까?
밀 마법사

1
@WheatWizard 메모리가 누출 될 필요는 없지만 할당 해제 된 것보다 빠르게 할당되어야합니다.
tbodt

2
프로그램이 무한한 메모리를 소비하기를 원할 때, 나는 그것을 얻을 수 없습니다. (reduce conj [] (range))(Clojure)는 최대 737mb까지 증가한 다음 성장을 중단합니다. 그것이 계속 일어나지 않는 방법 Idk. 마지막에 전체 목록을 인쇄하고 싶기 때문에 아무것도 버리지 않아야합니다. 매우 실망 스럽습니다.
Carcigenicate

14
자체 참고 사항 : 테스트하기 전에 코드를 저장하십시오. mem-leaks를 소개하면 IDE가 중단 될 수 있습니다.
steenbergh

1
필자는 이와 유사하지만 별도의 다른 골프 도전을 추가해야한다고 생각합니다. 프로그램은 선형 시간 함수보다 메모리를 더 빨리 소비해야합니다. 를 들어 현재의 도전, 단일 바이트를 영원히 반복하고 할당하는 것은 괜찮을한다. 당신을 위해 새로운 도전, 그 불충분 한 것이지만, 영원히 반복하고 각 시간을 사용하는 메모리의 양을 두배로 확인 될 것입니다.
BenGoldberg

답변:


46

Funge-98 ( cfunge), 1 바이트

9

나는 이것을 이전에 게시했지만 테스트하기로 결정했으며 내 컴퓨터를 다시 사용 가능한 상태로 되돌리기까지 시간이 걸렸습니다. cfungeFunge 스택을 운영 체제의 힙에 저장합니다 (이전에 수행해야했던 작은 메모리 제한으로 프로그램을 실행하여 쉽게 확인할 수 있습니다). 따라서 무한히 커지는 스택 (이 프로그램과 마찬가지로 9반복적으로 푸시됩니다) ; Funge 프로그램은 줄 끝에서 기본적으로 처음으로 줄 바꿈) 메모리를 영구적으로 할당합니다. 이 프로그램은 일부 Befunge-93 구현에서도 작동합니다.

더 흥미로운:

"NULL #(4

이것은 나의 첫 번째 아이디어였으며 Funge 스택에 의존하지 않는 무한 할당입니다 (Foolge 스택을 날려 버릴지라도). 우선, "명령은 나머지 프로그램의 복사본을 스택으로 푸시합니다 (문자열이며 프로그램은 줄 바꿈되므로 닫는 인용 부호도 열린 인용 부호 역할을합니다). 그런 다음 N반영 (기본적으로 의미가 없음)으로 인해 프로그램이 뒤로 실행됩니다. "다시 실행하고, 스택 프로그램 못살게 굴지 - 이번에 라운드 다른 방법으로, N다음 프로그램이 4 글자 이름 (도서관로드, 주위 랩 - 스택의 상단 4(하며 NULL라이브러리의 일부입니다 cfunge표준 라이브러리). NULL반영 할 모든 대문자를 정의하므로 L반영합니다.#도중에 라이브러리로드를 건너 뛰고 4스택에 신경 쓰지 않는 정크를 밀어 내고 전체 프로그램이 처음부터 반복됩니다. 라이브러리를 여러 번로드하면 효과가 있으며 라이브러리의 각 사본마다 라이브러리의 명령 목록을 한 번 저장해야합니다 (이것은 Funge-98의 시맨틱에 의해 암시 됨). 스택이 아닌 스토리지를 통해 메모리가 누출됩니다. OS가 아닌 언어와 관련하여 "힙"을 정의하는 대체 방법).


2
난 그냥 받아 들일거야 ...
tbodt

숫자가 9 여야합니까? 5 인 경우에도 작동합니까?
tbodt

스택으로 푸시되는 모든 것이 작동합니다 (가능하지 않습니다 0; 문제의 메모리가 이미 0으로 가득 찬 경우 Funge 구현 또는 OS가이를 최적화하는 방법을 찾을 수 있습니다). 나는 방금 9임의로 골랐다 .

22
내 명성이 여전히 666이되기를 원하기 때문에
받아들이지 않습니다

7
@tbodt 수락하지 않는 진짜 이유는 아닙니다. 원한다면 질문에 -1을하겠습니다. 그런 다음 수락하면 여전히 703이됩니다 (666이 아닌 703이 있음).
NoOneIsHere 여기

30

Brainfuck, 5 바이트

+[>+]

테이프 길이에 제한이없는 인터프리터가 필요합니다.


2
나는 그것이 + [> +]인지 확신합니다. 그렇지 않으면 첫 번째 반복에서 단순히 멈출 것입니다. ;)
Pâris Douady 2014

네 말이 맞아 오타.
vsz

40
brainfuck 솔루션이 경쟁력있는 드문 경우 중 하나입니다.
FlipTack

@ Flp.Tkc 그러나 여전히 잃습니다. 어쩌면 그것은 언젠가 이길 것입니다 ...
NoOneIsHere 여기에

6
@SeeOneRhino : 그것은 이미 모든 골프 언어를 이겼다> codegolf.stackexchange.com/questions/8915/…
vsz

22

배쉬 + coreutils, 5

또는

루비, 5

`yes`

yes끝없는 출력을 생성합니다. yes백틱을 넣으면 셸이 모든 출력을 캡처 한 다음 해당 출력을 명령으로 실행하도록 지시합니다. Bash는 힙이 다 떨어질 때까지이 끝없는 문자열에 대한 메모리 할당을 계속합니다. 물론 결과 출력은 유효하지 않은 명령이 될 수 있지만 그 전에 메모리가 부족해야합니다.

@GB 덕분에 루비의 폴리 글롯도 지적되었습니다.


7
나는 똑같이 쓰고 루비 프로그램이라고 불렀다.
GB

1
펄, 내 생각 엔
abligh

18

파이썬, 16 바이트

a오류에 도달 할 때까지 중첩을 유지합니다 .

a=0
while 1:a=a,

처음 몇 번의 반복 (튜플)은 다음과 같습니다.

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

등등.


18

> <> (물고기), 1 바이트

0

여기 사용해보십시오!

0 실제로는 16 진수 1-f로 대체 될 수 있습니다.

설명

0in> <>는 단순히 물고기가 수영 할 수 있도록 1x1 코드 박스를 만듭니다. 계속 0해서 스택에 a 를 추가하고 , 오른쪽으로 수영하며 0, 뒤로 돌아가서 스택에 다시 추가합니다. 이것은 영원히 계속 될 것입니다.


2
이제 얼마나 많은 다른 2 차원 언어가 작동하는지 궁금합니다. 대부분의 언어는 스택 기반입니다.

1
Cubix 에서 거의 작동 하지만 실행 라인으로 .이동 하려면 선행 (또는 공백이 아닌 문자)이 필요합니다 0.
ETHproductions

1
Ouroboros 에서 작동 하지만 같은 방식으로 작동 하지 않습니다. 인터프리터는 0000000...단일 정수 리터럴 로 읽으려고 시도하며 빌드하는 문자열은 계속해서 더 많은 메모리를 사용합니다. 이 방식대로 작동하는 프로그램 a(10을 무한히 푸시).
DLosc

12

자바 101 바이트

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

객체를 생성하고 버린 후 끝없는 루프에서 메인 프로그램을 잡기. 가비지 콜렉션은 삭제 된 각 오브젝트마다 2 개의 오브젝트를 작성하여 누출 작업을 수행합니다.


글쎄, 나는 지금 명백하지 않은 것에 대해 조금 바보 같은 느낌이 든다. 나는 이것이 나의 것보다 더 우아하다고 말하고 모험을했다
Poke

1
예, 귀하의 코드는 finalize () @poke를 통해 그 사실을 기억했습니다.
masterX244

난 당신이 정적 초기화와 메인 교체하여 짧게 만들 수 있다고 생각
tbodt

java6까지만 작동하며 더 높은 버전 만 사용합니다.
masterX244

2
haha 가비지 수집기를 사용하여 누출을 일으켰습니다! great idea :)
Mark K Cowan

12

펄, 12 바이트

{$"x=9;redo}

perl x에서 왼쪽에 문자열이 있고 오른쪽에 숫자가 있는 연산자는 반복되는 문자열을 생성합니다. 따라서로 "abc" x 3평가됩니다 "abcabcabc".

x=연산자는 오른쪽이 나타내는대로 콘텐츠를 여러 번 반복의 결과로 그 왼쪽 변수의 내용을 대체 왼쪽 인자 변이합니다.

펄은 하나의 변수에 내장 이상하게라는 다수의 숫자 가지고 $", 초기 값 한 공간이다.

redo운영자는 바깥 쪽의 시작 부분으로 이동합니다 {}.

x=연산자를 처음 수행하면 값이 " $"에서 " ""( " "9 개의 공백)으로 변경됩니다.

x=연산자가 두 번째 로 수행되면 값이 $"로 변경 " "됩니다 (81 공백).

세 번째 $"는 729 바이트 길이의 공백 문자열이됩니다.

나는 이것이 어디로 가고 있는지 볼 수 있다고 생각합니다 :).


당신은 나를 이길! 그리고 당신은 3 바이트 더 짧습니다.
가브리엘 베 나미

1
이 웹 사이트에서 가장 작은 루프를 검색하는 것입니다. :). 또한 처음에는 $_.=7루프에 있었지만 사용할 수 있으면 x=훨씬 더 빠른 메모리가 부족한 다음 perldoc perlvar적절한 것을 선택하기 위해 실행 되었습니다.
BenGoldberg

{$^O++;redo}^O단일 chr(15)바이트 인 경우 1 바이트 더 짧습니다 . MUCH 느린 속도로 메모리를 낭비하지만 Windows에서 1 바이트를 낭비하려면 1000000000 반복이 필요합니다. 라틴 문자로 시작하는 이름을 가진 모든 OS에서 작동합니다.
Oleg V. Volkov 2014

11

sed, 5 바이트

골프

H;G;D

사용법 (모든 입력이 가능함)

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

설명

#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

스크린 샷

여기에 이미지 설명을 입력하십시오

온라인으로 사용해보십시오!


2
엄밀히 말하면 이것은 GNU sed (세미콜론은 표준 sed가 아니지만) 어쨌든 세미콜론과 마찬가지로 개행이 작동합니다.
R ..

10

하스켈, 23 19 바이트

main=print$sum[0..]

무한 목록의 합계를 인쇄


이것은 평가를 시행하는 좋은 방법이며 매우 컴팩트합니다. +1
Esolanging Fruit

컴파일러 는 이것을 O (1) 메모리에서 잘 실행할 수 있습니다. GHC에서 sum으로 정의되고 foldl (+) 0썽크 분출을 방지하기 위해 엄격 분석을 중지하는 것은 무엇입니까? 최적화로 컴파일하여 실행 했습니까?
Will Ness

@WillNess 대답은 무엇입니까? sum목록이 무한하다는 것을 미리 알지 못 print하므로 합계를 먼저 평가해야합니다. 그리고 네, 최적화로 컴파일했습니다
Angs

답이 없을 것이다. 그러나 계산은 O (1) 공간에서 실행됩니다. 죄송합니다. 기본값으로 Integer인해 숫자가 제한되지 않으며 현재 숫자가 큰 결과로 얻은 메모리 가 실제로 커질 것입니다.
Will Ness

1
명확히하기 위해, 필자는 의미 sum xs = foldl (+) 0 xs있는 루프그러 하듯 이 계산이 일정한 스택으로 실행될 수 있다는 것입니다. foldl' (+) 0 xs확실히 것입니다. 따라서 메모리를 확실하게 할당하는 유일한 것은 큰 숫자의 중간 결과입니다.
Will Ness

9

C ++ (g ++ 컴파일러 사용), 27 23 15 바이트

4 바이트를 제거하는 데 도움을 준 Neop에게 감사합니다.

이 솔루션은 스택에 모든 것을 할당하여 스택 오버플로를 유발하기 때문에 실제로 메모리를 누출하지 않습니다. 단순히 무한 재귀입니다. 각 재귀로 인해 스택이 오버플로 될 때까지 일부 메모리가 할당됩니다.

main(){main();}

대체 솔루션

이 솔루션은 실제로 메모리를 누출시킵니다.

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

발 그린 드 출력

프로그램을 런타임에 몇 초간 종료 한 후 Valgrind 출력입니다. 확실히 메모리가 누출되고 있음을 알 수 있습니다.

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

3
제목이 잘못되었습니다. 문제는 "영원히 지속적으로 메모리를 할당하는 프로그램을 작성하는 것"이라고 말합니다.
NobodyNada

아, 내가 보냈을 때 이미 답변을 제출 한 것을 몰랐습니다.
Neop

1
@Neop 글쎄, 난 int 당신이 너무 감사를 볼 때까지 당신이 생략 할 수 몰랐어요 !
밀 마법사

2
아니 C++, 그것의 g ++ 방언 : C ++은 main 호출을 금지합니다. C ++에는 int main...선언이 필요합니다 . 그러나 해결책은 여전히 ​​깔끔합니다 :-)
Martin Ba

1
실제로 C ++는을 호출하는 것을 금지 main합니다.
R ..

9

자바, 81 79 78 바이트

자바 (HotSpot) 71 70 바이트

내가 게시 할 당시 다른 Java 답변보다 짧습니다 (81, 나중에 79 바이트).

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

@Olivier Grégoire가 제안한 것처럼 추가 바이트를 저장할 수 있습니다.

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

x+=x.intern()for 문을 끝내려면 세미콜론이 여전히 필요하므로 for 루프 증분으로 배치 해도 아무 도움이되지 않습니다.

@ETHproductions에서 제안한대로 x+=x작동하는 것만 있습니다.

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

@Olivier Grégoire의 팁에서 도움이 될 수도 있습니다.

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

효율적인 JVM은 쉽게 로컬 함수 를 벗어나지 않는다는 것을 쉽게 알 수 있기 때문에 힙에 대한 데이터 할당이 보장되지 않는다는 유일한 오해가 x있습니다. intern()인터 닝 된 문자열은 결국 정적 필드에 저장되므로 사용 하면 이러한 문제 를 피할 수 있습니다. 그러나 HotSpot은 OutOfMemoryError해당 코드에 대해를 생성 하므로 괜찮습니다.

업데이트 : @Olivier Gregoire는 또한 많은 메모리를 사용할 수있을 때보 다는 x+=x코드가 실행될 수 있다고 지적했습니다 . Java는 32 비트 유형을 사용하여 배열을 인덱싱하고 문자열은의 배열 일뿐입니다 . 후자에 필요한 메모리가 문자열 길이의 2 차이므로 솔루션에 영향을 미치지 않으므로 2 ^ 62 할당 바이트 정도까지 확장해야합니다.StringIndexOutOfBoundsExceptionOOMintcharx+=x.intern()


PPCG에 오신 것을 환영합니다! 나는 Java를 잘 모른다. 방금 한 경우 x+=x;어떻게됩니까?
ETHproductions

x+=x.intern()for 루프의 마지막 세미콜론을 뒤에 넣어 세미콜론을 면도 할 수 있습니다
masterX244

좋은 대답입니다. 나는 끈으로 무언가가 있어야한다는 것을 알았지 intern만 Unsafe에 매우 만족했고 내가 그만 두는 것을 끝내 었습니다. 원래이 질문은 "메모리 누수"를 지정했기 때문에 문자열 연결 답변 만하지 않았습니다.
Poke

답변이 Java의 특정 구현에 의존하고 모든 Java 구현에 이식 가능하지 않을 경우 제목에 정보를 배치 할 수 있습니다 (예 :) # Java (HotSpot), 71 bytes. 그렇게하면 잠재적으로 부정 행위를하는 솔루션에 대해 걱정할 필요가 없습니다. 구현 별 프로그램은 골프뿐만 아니라 더 넓은 프로그래밍 세계에서도 공통적이며, 수행하는 작업을 알고있는 한 휴대용 프로그램보다 더 적합 할 수 있습니다. 스크립트에서.

1
흠 ... x+=x;전체 메모리를 다 쓰지 않습니다. 64GB를 사용 StringIndexOutOfBoundsException하면 OOM이 아닌을 얻습니다 . 와 .intern()난 여전히 OOM를 얻을.
Olivier Grégoire

8

펄 6 , 13 바이트

@= eager 0..*

설명:

@ = 명명되지 않은 배열에 결과를 저장

eager 다음 목록을 열망하게하다

0 .. * 0에서 시작하는 무한 범위


8

///, 7 바이트

/a/aa/a

지속적 a으로 aa, 광고 구역으로 교체하십시오 .


12
*aad naauseum
timothymh

1
* ad nauseam=>aad naauseaam
Aaron

무엇에 대해 //a/? 그것은``(아무것도)으로 ​​영원히 대체하는 것처럼 보이지만 이것이 a정확하게 지정되었는지는 확실하지 않습니다.
Cedric Reichenbach

6

파이썬 3, 16 바이트

i=9
while 1:i*=i

이것은 파이썬 3에서 정수 크기에 제한이 없다는 사실에서 비롯됩니다. 대신 정수는 시스템이 처리 할 수있는만큼 많은 메모리를 차지할 수 있습니다 (이에 대한 이해가 잘못되면 나를 수정하십시오).


제목은 메모리가 누출되어야 함을 의미합니다. 그러나 이것은 실제로 메모리 누수가 아닙니다. 저자는 아마도 분명히해야합니다.
밀 마법사

6

녹, 46 바이트

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

이 Rust 프로그램에서 메모리 부족이 발생할 때까지 힙 할당을 누설하는 흥미로운 점이 있습니까?

맞습니다. 안전하지 않은 블록은 없습니다. Rust는 안전한 코드 (초기화되지 않은 데이터를 읽지 않고, 읽은 후 읽거나, 두 번을 두지 않는 등)에서 메모리 안전을 보장하지만 메모리 누수는 완벽하게 안전한 것으로 간주됩니다. 컴파일러가 범위를 벗어난 변수의 RAII 정리를 잊게 만드는 명시 적 기능도 있습니다.


6

TI-83 육각 어셈블리, 7 바이트

PROGRAM:M
:AsmPrgm
:EF6A4E
:C3959D
:C9

ERR:MEMORYOS에 의해 throw 될 때까지 appvar을 무기한으로 만듭니다 . 로 실행하십시오 Asm(prgmM). 16 진수의 각 쌍을 1 바이트로 계산합니다.


6

파이썬, 8 바이트

2**9**99

OP 는 기술적으로 "영원히"실행되지 않지만 어떤 컴퓨터에서도 처리 할 수있는 것보다 더 많은 메모리를 할당하는 프로그램 의 기술성 을 허용했습니다. 이것은 상당히 구골 플렉스 (즉 10**10**100, 11 바이트)는 아니지만 순진하게 숫자의 로그베이스 2는

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

즉, 이것을 나타내는 10 ^ 94 비트. WolframAlpha는 이것을 딥 웹보다 10 ^ 76 더 크게 넣습니다 ( 우주 에는 약 10 ^ 80 개의 원자가 있다는 것을 명심 하십시오 ).

왜 9 대신 2가 묻습니까? 큰 차이는 없습니다 (9를 사용하면 비트 수를 인수만큼 증가 log2(9) = 3.2시켜 지수를 변경하지도 않습니다). 그러나 계산이 더 간단하기 때문에 프로그램은 2로 훨씬 빠르게 실행됩니다. 즉, 9 버전과 달리 메모리가 즉시 채워 지므로 필요한 계산으로 인해 시간이 조금 더 걸립니다. 필요하지는 않지만 이것을 "테스트"하고 싶다면 좋습니다.


5

젤리 , 3 2 바이트

Dennis 덕분에 -1 바이트 ( W랩)

전체 프로그램으로도 작동하는 링크 (예 : 함수 또는 메소드)는 입력을 목록으로 재귀 적으로 랩핑합니다.

입력은 0으로 시작하므로 첫 번째 패스는 목록을 생성하고 [0]
두 번째 패스는 이것을 [[0]]
만듭니다 [[[0]]]
.


훨씬 빨리 누출되는 이전 3 개월 :

;Ẇß

비어 있지 않은 연속 된 모든 서브리스트를 입력에 재귀 적으로 연결합니다.
[0]-> [0,[0]]-> [0,[0],[0],[[0]],[0,[0]]]등등 ...


규칙을 올바르게 이해하면 ‘ß충분해야합니다.
Dennis

실제로 "연속적으로 메모리를 할당"합니까 (파이썬이 작은 정수에 대해 일정한 할당을 유지하는 것을 생각합니다).
Jonathan Allan

1
그럴 수 있지. 그래도 청구서에 맞아야합니다.
Dennis

5

자바 7, 106 바이트

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

덜 골프

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

finalize가비지 컬렉션 오브젝트에 대한 참조가 더 이상 없다고 판정 한 경우에있어서 가비지 수집기 객체에서 호출된다. 가비지 수집기가 실제로 메모리를 해제하지 않도록이 메서드를 영원히 반복하도록 단순히 재정의했습니다. 에서 main루프 그래서 결국이 가능한 모든 메모리를 사용합니다 정리되지 않습니다 새 개체를 만들 수 있습니다.

Java 7 (재미있는 대안), 216 바이트

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);}}

덜 골프

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);
        }
    }
}

이것은 다른 무엇보다 재미있는 것입니다. 이 답변은 Unsafe문서화되지 않은 내부 API 인 Sun 라이브러리를 사용 합니다. 제한된 API를 허용하도록 컴파일러 설정을 변경해야 할 수도 있습니다. Unsafe.allocateMemory힙과하지 (모든 경계 확인하지 않고) 바이트의 지정된 시간 할당 하지 당신이 호출 할 때까지이 메모리가 곁에 있도록 자바의 가비지 컬렉터의 관리하에 Unsafe.freeMemory또는 JVM의 메모리가 모두 소모 될 때까지합니다.


1
Java가 여기에 있는지 궁금합니다.
Magic Octopus Urn

가비지 수집기가 별도의 스레드에서 실행되는 경우 첫 번째 것이 작동하지 않습니까?
tbodt

@ tbodt 네,하지만 이것이 사실이 아니라고 생각합니다. 가비지 수집기는 가비지 수집기라는 데몬 스레드에서 발생합니다.
Poke

@Poke가 보장됩니까? 아니 대답은 아직 괜찮지 만, 가비지 컬렉터가 자신의 스레드에서 실행되는 경우에만 작동하는지 명확히해야하는 경우
tbodt

@tbodt 나는 그렇게 생각 하지만 정직하지는 않습니다.
Poke

5

하스켈, 24 바이트

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

Haskell의 주요 문제는 게으름을이기는 것입니다. main어떤 IO유형 이 필요하기 때문에 단순히 전화를 main=f 9걸면 작동하지 않습니다. 사용하여 main=pure(f 9)리프트의 종류 f 9IO유형입니다. 그러나 구조가 좋아 사용 main=pure 9, 아무것도하지 않는이 9반환 또는 아무 표시되지 단순히 폐기, 그래서의 인수를 평가 할 필요가 없습니다 pure, 따라서 main=pure(f 9)어떤 메모리로 할당 할 발생하지 않습니다 f호출되지 않습니다. 평가를 시행하기 위해 $!운영자가 존재합니다. 단순히 함수를 인수에 적용하지만 인수를 먼저 평가합니다. 따라서 main=pure$!f 9평가를 사용하면 f더 많은 메모리가 지속적으로 할당됩니다.


컴파일되면 런타임은 루프를 감지하고 실행을 중단합니다
Angs

@Angs Windows에서 ghc로 컴파일하고 메모리를 행복하게 할당합니다 ... 3GB에서 중지했습니다.
Laikoni

f x=f x작품도 사용 합니까? (−2 bytes)
wchargin

@ wchargin 나는 그렇게 생각하지 않고 f x=f x무한 루프를 생성하지만 새로운 메모리를 할당 하지 않습니다 .
Laikoni

멋지다, 큰 숫자 계산으로 메모리 폭발이 발생합니다! f!x=x*f(x*x)최적화 방지해야합니다.
Will Ness

5

dc, 7 바이트

[ddx]dx

[ddx]"ddx"가 포함 된 문자열을 스택으로 푸시합니다. dx그것을 복제 한 다음 코드로 실행합니다 (스택에 하나의 사본을 남겨 둡니다). 실행될 때 두 번의 복제본을 만든 다음 하나를 실행하여 매번 스택에 하나 더 사본을 남깁니다.


잠깐, 메모리가 병렬로 실행될 수 있다면 기하 급수적으로 메모리를 할당합니까?
HyperNeutrino

5

Haskell (ghc 8.0.1 사용), 11 바이트

m@main=m>>m

비 꼬리 재귀. main스스로 호출 한 다음 다시 호출합니다.


이것은 힙이나 스택에 할당됩니까? (저도 믿을 수 있습니다; 사용중인 Haskell 컴파일러에 따라 달라질 수 있습니다.)

1
@ ais523 : 다릅니다. Haskell에는 호출 스택이 없습니다 . 런타임 시스템 RTS는 "스택"이라고도하는 패턴 매칭을위한 메모리 영역을 갖는다. 이 스택은 힙에 할당됩니다. 솔직히 말해서, 여기에서 무슨 일이 일어나고 있는지 모르겠습니다 Stack space overflow: current size 33624 bytes..33k로 프로그램이 실패 하면 OS 가보고하는 총 메모리의 6G와 비교하여 상당히 낮게 보입니다.
nimi

1
@ ais523 : ghc 오류 메시지의 메모리 정보에 버그가있는 것 같습니다 . 따라서 정확히 어떤 일이 일어나는지 말하기 어렵습니다.
nimi

Ubuntu에서 GHC 7.10.3으로 컴파일 된이 기능은 최적화가 비활성화 된 경우에도 일정한 양의 메모리를 필요로합니다.
Angs

@Angs : 흠, MacOS에서 ghc 8.0.1을 사용합니다. 이 부분을 편집하겠습니다.
nimi

5

C (리눅스), 23 바이트

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

sbrk()주어진 바이트 수만큼 데이터 세그먼트의 맨 위를 증가 시켜서 최소한 출력 VIRT필드에 보고 된대로 프로그램에 할당 된 메모리의 양을 효과적으로 증가 top시킵니다. 이것은 Linux에서만 작동합니다. macOS 구현은 분명히 최대 4MB의 할당 만 허용하는 에뮬레이션입니다.


약간 더 일반적인 답변 :

C, 25 바이트

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

macOS Activity Monitor에서 봤습니다. 약 48GB까지 진행되었으며 결국 프로세스는 SIGKILL 신호를 받았습니다. 내 맥북 프로는 16GB입니다. 사용 된 대부분의 메모리는 압축 된 것으로보고되었습니다.

이 질문은 각 할당을 효과적으로 작성해야하며 여기서 명시 적으로 발생하지는 않습니다. 그러나 모든 malloc(9)호출에 대해 할당 된 것은 9 명의 사용자 요청 바이트 만이 아니라는 점에 유의해야합니다 . 할당 된 각 블록에 대해 힙의 어딘가에서 할당 된 malloc 헤더가 있으며 이는 malloc()내부에서 작성해야합니다 .


malloc을 사용하면 malloc이 아무것도 초기화하지 않기 때문에 메모리에 직접 쓰지 않습니다. malloc은 메모리 관리를 위해 내부 스토리지가 필요하기 때문에 메모리 만 할당됩니다. 따라서 대답은 실제로 표준은 아니지만 어쨌든 어디서나 작동한다고 생각합니다.
Antzi

@Antzi 예. 그러나 사용자 메모리를 실제로 쓰기 전에 할당 할 수는 없지만 각 malloc()ed 블록에는 여전히 실제 할당 된 공간이 있어야 하기 때문에 여전히 작동한다고 생각 합니다. 이것은 macOS 및 Ubuntu에서 작동합니다.
Digital Trauma

각 페이지에 쓰여지는 문제의 조건은 의미가 없습니다. OS가 적절한 커밋 계정을 수행하지 않는다고 가정하더라도 구현 세부 사항에 관계없이 할당 당 0이 아닌 부기장이 필요합니다. 할당에 인접 해 있는지 (페이지를 건 드리게 함) 여부에 관계없이 결국 0이 아닌 데이터로 (필요하게) 부기를 유지하기 위해 임의의 양의 메모리를 소비합니다.
R ..

당신은 그것을 1 바이트 작게 얻을 수 main(){main(malloc(9));}있지만 오버플로를 쌓지 않기 위해서는 꼬리 호출 최적화가 필요하며 gcc는 그것을 원하지 않는 것 같습니다 main...
R ..

malloc (9)를 calloc (9,9)로 바꾸면 9 바이트 블록의 9 개 인스턴스 (배열에 따라 81에서 144 바이트 사이)에 할당 된 메모리가 충분하지만 더 중요한 것은 calloc ( )는 메모리 블록을 제로로 채워 기본 OS가 스토리지를 할당하도록합니다.
CSM

5

펄, 4 바이트

do$0

현재 인터프리터에서 자체를 실행합니다. 완료되면 실행은 호출 스크립트로 돌아가며 호출 스택이 필요합니다.


멋지고 짧지 만 메모리를 빠르게 낭비하지는 않습니다.
BenGoldberg

4

라켓, 13 바이트

(let l()(l)1)

내 대답이이 질문에 해당되는지 확실하지 않습니다. 이 답변을 삭제해야하는지 알려주십시오.


어떻게 작동하는지 설명 할 수 있습니까?
tbodt

1
아, 이것은 l테일 콜이 아닌 재귀를 수행하는 함수로 정의 됩니다. 나는 그것이 중요하다고 말하고 싶습니다.
tbodt

@tbodt 네 돈에 맞아
Winny

4

JavaScript 22 21 17 16 15 바이트

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

@Jonathan Allan의 Jelly 답변에서와 같이 다른 목록에 목록을 배치하여 4 바이트를 절약했습니다.

@ETHProductions 덕분에 1 바이트 절약

대체 솔루션 15 바이트 (적절한 테일 콜에서만 작동)

f=a=>f([a]);f()

1
ES6의 두 번째 예에서, 당신은 할 수 없었 f=_=>f();f()습니까? 12 바이트
물린

@bitten 확실하지 않습니다. 그것이 호출 스택을 날려 버린다면, 적절한 꼬리 호출이없는 것이 갈 길입니다. TCO를 사용하면 메모리 누수가 발생할 것이라고 생각하지 않습니다.
Lmis

둘 다 나를 위해 콜 스택을 날려 버린다 . 나는 꼬리 호출에 익숙하지 않으므로 그것에 대해 언급 할 수 없습니다.
물린

1
아 알다시피, 당신의 메모리 누수가 어떻게되는지 모르겠습니다
물린

1
를 제거 할 수 a=0있습니다. 첫 번째 반복은 다음과 같습니다a=[undefined]
Florent

4

루비, 11 바이트

loop{$*<<9}

넓히는 9$*처음 루비 프로세스 명령 행 인수를 보유하는 배열이다.


4

05AB1E , 2 바이트

[A

온라인으로 사용해보십시오! abcdefghijklmnopqrstuvwyxz영원히 스택에 계속 밀어 넣을 것입니다.

가능한 모든 2 바이트 솔루션 :

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

매우 철저합니다! 좋은.
timothymh

3

파이썬, 35 바이트

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

a 당신이 때까지 결코 해제되지 않고 더 커집니다 MemoryError

Python Tutor 에서 실행을 볼 수 있습니다 .


1
당신은 할 수 있습니까 a+=a,?
Cyoce

기능이 필요 없습니다. 여기 골프 가 있습니다
FlipTack

@ Flp.Tkc이 답변을 작성한 후에 질문이 변경되었습니다. 현재 형식으로 수행 한 경우 (+-몇 문자)했을 것입니다.
Noelkd

3

TI-BASIC, 8

:Lbl A
:While 1
:Goto A

(모든 1 바이트 토큰 및 두 줄 바꿈)

이로 인해 While예상되는 닫힘 과 같은 구조적 제어 흐름 End이 스택에서 무언가를 푸시 (OS 스택이 아니라 힙 메모리의 별도 스택)하여이를 추적 하기 때문에 메모리가 계속 누출됩니다 . 그러나 여기서 우리는 Goto루프를 떠나기 위해 사용 하고 있습니다 (그래서 End스택에서 물건을 제거하기 위해 실행되는 것은 없습니다 ), While다시 보여지고, 물건이 다시 밀리는 등. 그래서 당신이 얻을 때까지 계속 밀어 넣습니다.ERR:MEMORY

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.