किसी भी फोर्क बम के बिना एक स्मृति रिसाव बनाएँ [बंद]


54

आपका काम मेमोरी लीक बनाना है । यह एक ऐसा प्रोग्राम है जो मेमोरी के भार का उपयोग करता है, जब तक कि कंप्यूटर रन आउट न हो जाए और खुद को रनिंग से बचाने के लिए कुछ स्वैपिंग करनी पड़े। मेमोरी जारी करने का एकमात्र तरीका कार्य प्रबंधक में प्रोग्राम को मारना या कमांड लाइन किल जैसे taskkill /im yourprogram /f(विंडोज में) का उपयोग करके या यहां तक ​​कि कंप्यूटर को पुनरारंभ करना है। केवल ऐप को बंद करने से इसे हॉग मेमोरी को जारी रखने से नहीं रोका जाना चाहिए।

नियम:

  1. किसी भी प्रकार के फोर्क बम पर प्रतिबंध लगा दिया जाता है। इसका मतलब है कि कुख्यात बैश लाइन :(){ :|:&};:पर प्रतिबंध है!

  2. आवेदन केवल एकल-थ्रेडेड होना चाहिए। इसका मतलब कांटा बम नियम है।

  3. प्रोग्राम को अन्य प्रोग्राम नहीं चलाना चाहिए। इसका मतलब है कि आप ऐसा कुछ नहीं कर सकते run(memoryfiller.exe)। इसका एकमात्र अपवाद ऐसे प्रोग्राम हैं जो आपके ओएस या भाषा के साथ बंडल किए गए हैं, जो मुख्य रूप से मेमोरी का उपभोग करने के लिए डिज़ाइन नहीं किए गए हैं (अर्थात उनका एक और उद्देश्य है)। इसका मतलब है कि जैसी चीजें catऔर ln -sअनुमति दी जाती है।

  4. आप जितनी चाहें उतनी मेमोरी ले सकते हैं। अधिक बेहतर।

  5. कोड पूरी तरह से समझाया जाना चाहिए।

सौभाग्य। यह एक लोकप्रियता प्रतियोगिता है, इसलिए 10 दिनों के बाद सबसे अधिक मतों के साथ कोड पूछते हुए जीत जाता है!


8
"इसे बंद करना अभी भी इसे हॉग मेमोरी बनाना चाहिए" - यदि कोई प्रोग्राम एक शेल एग्जीक्यूटेबल है (जैसे स्क्रिप्टिंग लैंग्वेज इंटरप्रिटर्स के अधिकांश विंडो संस्करण हैं), तो इसकी विंडो को बंद करने से प्रोग्राम को मार दिया जाएगा।
मैनीप

54
क्या यह सिर्फ नहीं है while(1)malloc(999);?
दरवाज़े

10
मुझे यकीन नहीं है कि अगर "इसे अभी भी बंद करना चाहिए तो इसे हॉग मेमोरी बना देना चाहिए" के साथ संगत है "एप्लिकेशन को केवल थ्रेडेड होना चाहिए।" यदि किसी थ्रेड में मेमोरी का हिस्सा नहीं है, तो OS इसे वापस ले सकता है, है ना?
ऐनाबिस

51
बस आधे घंटे के लिए कुछ टैब ओपन रनिंग फ्लैश के साथ फायरफॉक्स 26 चलाएं। यह आपके कंप्यूटर को उसके घुटनों पर लाएगा।
ब्रैडेन बेस्ट

1
@mniip। यह चुनौती का पूरा बिंदु है। एक कठिन चुनौती बनाने के लिए। और डॉर्कनोब। मुझे कुछ अलग चाहिए था! ;)
जॉर्ज

जवाबों:


78

खिड़कियाँ

Win32 API आपको अन्य प्रक्रियाओं में मेमोरी आवंटित करने की अनुमति देता है, और फिर उस मेमोरी को दूरस्थ रूप से पढ़ने / लिखने के लिए। इस प्रोग्राम में केवल एक थ्रेड होता है, जिसका उपयोग यह सिस्टम पर प्रत्येक रनिंग प्रक्रिया को एन्यूमरेट करने के लिए करता है, और फिर आवंटन के विफल होने तक प्रत्येक प्रक्रिया में बार-बार 1MB बफ़र आवंटित करता है। जब यह एक प्रक्रिया के साथ पूरा हो जाता है, तो यह अगले पर चला जाता है। आवंटन तब जारी नहीं किए जाते हैं जब कॉलिंग कार्यक्रम समाप्त होता है - केवल तब जब / जब प्रत्येक लक्ष्य प्रक्रिया समाप्त हो जाती है। यह लगभग 10 सेकंड में 2GB का विंडोज 7 वीएम लटका देता है। यह व्यवस्थापक के रूप में चलाने की आवश्यकता है।

संकलन करना: cl /MD leak.cpp /link psapi.lib

#include <windows.h>
#include <psapi.h>

typedef void (*ProcFunc)(DWORD pid);
#define ALLOC_SIZE 0x100000
LPVOID buf;

void ForEachProcess(ProcFunc f)
{
    DWORD aProcesses[1024], cbNeeded;

    if (!EnumProcesses( aProcesses, sizeof(aProcesses), &cbNeeded))
        return;

    for (unsigned int i = 0; i < cbNeeded / sizeof(DWORD); i++)
        if (aProcesses[i] != 0)
            f(aProcesses[i]);
}

void RemoteLeak(DWORD pid)
{
    HANDLE hProcess = OpenProcess( PROCESS_ALL_ACCESS, FALSE, pid );
    if (hProcess == NULL)
        return;

    for (;;)
    {
        LPVOID ptr = VirtualAllocEx(hProcess, NULL, ALLOC_SIZE, 
                                    MEM_COMMIT, PAGE_READWRITE);
        if (ptr == NULL)
            return;

        WriteProcessMemory(hProcess, ptr, buf, ALLOC_SIZE, NULL);
    }
}

int main(void)
{
    buf = malloc(ALLOC_SIZE);
    if (buf == NULL)
        return 0;

    memset(buf, 0xFF, ALLOC_SIZE);

    ForEachProcess(RemoteLeak);

    return 0;
}

9
विंडोज बुराई है।
tomsmeding

4
मुझे आज रात बंद करने की जरूरत है। बीमार इसे जाने दें;)
जॉर्ज

1
"(सामान्य उपयोगकर्ता के रूप में चल रहा है, व्यवस्थापक विशेषाधिकारों का उपयोग नहीं कर रहा है" - इस बारे में निश्चित नहीं है, आपको SeDebugPrivilege की आवश्यकता है जो डिफ़ॉल्ट रूप से नियमित उपयोगकर्ता टोकन में मौजूद नहीं है
rkosegi

@rkosegi धन्यवाद, निश्चित।
एंड्रयू मेडिको

14
+1 यह कई अपवित्रों का हकदार है क्योंकि यह अभी तक एकमात्र उत्तर है जो मूल समापन को पूरा करता है फिर भी इसे हॉग मेमोरी आवश्यकता बना देना चाहिए । बहुत रचनात्मक समाधान :-)
डैनियल

72

जावा

import java.util.concurrent.atomic.AtomicInteger;

public class Hydra {
  // Not actually necessary for the leak - keeps track of how many Hydras there are, so we know when they're all gone
  public static AtomicInteger count = new AtomicInteger(0);
  public Hydra() {
    count.incrementAndGet();
  }
  protected void finalize() {
    new Hydra();
    new Hydra();
    count.decrementAndGet();
  }

  public static void main(String[] args) throws InterruptedException {
    new Hydra();
    while (Hydra.count.get() > 0) {
      // Prevent leaks ;-)
      System.gc();
      System.runFinalization();
    } 
  }
}

व्याख्या

आप मान सकते हैं कि चूंकि कोड में कोई संदर्भ नहीं हैं (इसके अलावा count, जिसे आप सुरक्षित रूप से अनदेखा कर सकते हैं), यह लीक नहीं हो सकता। हालाँकि, अंतिम रूप से दो नए हाइड्रा बनाता है, और जब तक यह इन दोनों के लिए संदर्भ नहीं रखता है, वे अंतिम रूप तक घूमेंगे। इसका मतलब यह है कि कार्यक्रम केवल कचरा संग्रहण के दौरान स्मृति को लीक करता है - इसलिए कॉल टू System.gc()और System.runFinalization()


7
@TimS। तुम्हारे भगवान अब कहाँ है?!?
क्रंचर

हैं System.gc()और System.runFinalization()आवश्यक हैं? यह है कि जीसी अनियमित रूप से कभी-कभी चलेगा, या क्या आपको या तो कुछ मेमोरी भरना है, या जीसी को कॉल करना है?
क्रंचर

4
एक विशिष्ट कार्यक्रम में, System.gc()और System.runFinalization()आवश्यक नहीं होगा। मेमोरी के दबाव के कारण कचरा संग्रह स्वाभाविक रूप से होता है। हालांकि इस एप्लिकेशन में कोई मेमोरी प्रेशर नहीं है, जब तक कि कचरा संग्रह शुरू न हो जाए। मैंने कृत्रिम रूप से कुछ पेश करने के बारे में सोचा था (उदाहरण के लिए, new Hydra()लूप के अंदर जाकर ), लेकिन लगा कि यह अधिक दुष्ट है।
जेम्स_पिक

1
हाँ, मैंने "इसे बंद करने पर अभी भी ध्यान देना चाहिए, इसे हॉग मेमोरी बना देना चाहिए" चेतावनी, क्योंकि यह सार्थक नहीं लग रहा था (@ जर्मन_गुवाई की तरह स्वच्छ ओएस हैक के अलावा)। जावा हमेशा एक अंतिम रूप देता है, इसलिए शायद # 2 नियम का पालन करने के लिए जावा एप्लिकेशन के लिए कोई रास्ता नहीं है।
जेम्स_पिक

1
यूनिक्स प्रणालियों पर, आप SIGKILL (सिग्नल 9) को ब्लॉक नहीं कर सकते हैं, इसलिए आप अपने प्रोग्राम को बिना रुके (अच्छी तरह से नहीं बना सकते हैं, सिवाय इसके कि आप इसे बिना किसी प्रतीक्षा के स्थिति में ले जाएं ... इसलिए शायद NFS सर्वर को रिमोट से मारना या इन फ़ाइलों को आपके द्वारा बनाया गया है। पहुँच काम कर सकता है ;-))
celtschk

37

सी

सी प्रोग्रामिंग भाषा का उपयोग करना और लिनक्स कर्नेल 2.6.32-49-जेनेरिक और libc-2.11.1.so के साथ परीक्षण किया गया।

स्मृति को रिलीज़ करने का एकमात्र तरीका कार्य प्रबंधक में प्रोग्राम को मारकर या टास्ककिल / im yourprogram / f का उपयोग करके या यहां तक ​​कि पीसी को पुनरारंभ करना है।

यह SIGKILL और SIGSTOP को छोड़कर किसी भी सिग्नल को ब्लॉक करके हासिल किया जाता है।

इसे बंद करना अभी भी इसे हॉग मेमोरी बनाना चाहिए।

यह वास्तव में मुझे भ्रमित करता है ... इस प्रक्रिया को समाप्त करने में दोनों को मारना या बंद करना, ऑपरेटिंग सिस्टम को किसी भी मेमोरी को वापस करने का दावा करने की अनुमति देता है जो प्रक्रिया द्वारा आवंटित किया गया था। लेकिन तब मुझे लगा कि इसे बंद करने का मतलब हो सकता है कि आप टर्मिनल या किसी अन्य मूल प्रक्रिया को बंद कर दें जो मेमोरी लीक करने की प्रक्रिया को अंजाम देती है। अगर मुझे वह अधिकार मिल गया है, तो मैंने इस समस्या को किसी भी संकेत को अवरुद्ध करके हल किया, जो प्रक्रिया को डेमन में बदल देता है जब मूल प्रक्रिया समाप्त हो जाती है। इस तरह से आप उस टर्मिनल को बंद कर सकते हैं जो प्रक्रिया चल रही है और यह चलता रहेगा और मेमोरी को लीक करने के लिए आगे बढ़ेगा।

किसी भी प्रकार के फोर्क बम पर प्रतिबंध लगा दिया जाता है। इसका मतलब है कि कुख्यात बैश: () {: |: &} ;: प्रतिबंधित है

प्रक्रिया कांटा नहीं है।

आवेदन केवल एकल थ्रेडेड होना चाहिए। इसका मतलब कांटा बम नियम है

कोई नया सूत्र नहीं है।

प्रोग्राम को अन्य प्रोग्राम नहीं चलाना चाहिए। इसका मतलब यह है कि आप बस कुछ ऐसा नहीं कर सकते जैसे रन (memoryfiller.exe)

कोई नई प्रक्रिया नहीं है।

आप जितनी चाहें उतनी मेमोरी ले सकते हैं। अधिक बेहतर।

जितना ऑपरेटिंग सिस्टम प्रदान कर सकता है।

कोड पूरी तरह से समझाया जाना चाहिए।

स्रोत में टिप्पणियाँ जोड़ी गईं।

और अंत में यहाँ कोड है:

#define _GNU_SOURCE

#include <stdio.h>
#include <signal.h>
#include <sys/resource.h>
#include <unistd.h>
#include <stdlib.h>


int main(int argc, char* argv[]) {

    /*
    set the real, effective and set user id to root,
    so that the process can adjust possible limits.
    if the process doesn't have the CAP_SETUID capability, terminate the process.
    */
    if (setresuid(0, 0, 0) == -1) {
        printf("Are you root?!\n");
        return 1;
    }

    /*
    block all signals except for kill and stop.
    this allows to terminate the parent process (most likely a terminal)
    that this process is running in and turn it into a daemon.
    additionally this makes it impossible to terminate the process
    in a normal way and therefore satisfies the requirement that closing
    it should still make it hog memory.
    */
    sigset_t mask;
    sigfillset(&mask);
    sigprocmask(SIG_SETMASK, &mask, NULL);

    /*
    allow the process to acquire a virtually unlimited amount of memory
    and queue a virtually unlimited amount of signals.
    this is to prevent an out of memory error due to a virtual limit for the root user,
    which would prevent the process from leaking any more memory
    and to prevent the process from getting killed due to too many queued
    signals that the process is blocking.
    */
    struct rlimit memory = { RLIM_INFINITY, RLIM_INFINITY },
                  signal = { RLIM_INFINITY, RLIM_INFINITY};
    setrlimit(RLIMIT_AS, &memory);
    setrlimit(RLIMIT_SIGPENDING, &signal);

    /*
    allocate a buffer big enough to store a file name into it
    that is generated from the process' pid.
    if the file can be opened (which should always be the case unless /proc is not mounted)
    the file will be opened and the string -17 followed by a new line written to it.
    this will cause the oom killer to ignore our process and only kill other,
    innocent processes when running out of memory.
    */
    char file_name[20];
    sprintf(file_name, "/proc/%u/oom_adj", getpid());

    FILE* oom_killer_file = fopen(file_name, "w");
    if (oom_killer_file) {
        fprintf(oom_killer_file, "-17\n");
        fclose(oom_killer_file);
    }

    /*
    get the size of virtual memory pages in bytes,
    so the process knows the size of chunks that have to be
    made dirty to force the kernel to map the virtual memory page into RAM.
    */
    long page_size = sysconf(_SC_PAGESIZE);

    // allocate a virtually infinite amount of memory by chunks of a page size.
    while(1) {
        // will overwrite any previous stored address in tmp, leaking that memory.
        char* tmp = (char*) malloc(page_size);
        if (tmp)
            // make the memory page dirty to force the kernel to map it into RAM.
            tmp[0] = 0;
    }

    return 0;
}

यदि आप इस कार्यक्रम को चालू रखते हैं तो क्या होता है, इसके लिए इच्छुक व्यक्ति के लिए: 2GB RAM और 4GB स्वैप स्थान के साथ मेरे परीक्षण सिस्टम में RAM और स्वैप को भरने में लगभग 10 मिनट का समय लगा। ओओएम हत्यारे ने अपना काम शुरू कर दिया और तीन मिनट बाद सभी तरह की प्रक्रियाएं मार दी गईं। यहां तक ​​कि माउस, कीबोर्ड और डिस्प्ले को सिस्टम ने गिरा दिया है। /var/log/kern.log कोई उपयोगी जानकारी नहीं दिखाती है, सिवाय उन प्रक्रियाओं के जो मारे गए हैं।


मैंने ओओम हत्यारे को प्रक्रिया की अनदेखी करने और निर्दोष प्रक्रियाओं को मारने के बजाय स्मृति को मुक्त करने के लिए स्रोत का संपादन किया।
फोब्बर

5
यदि आप इस कार्यक्रम को चालू रखते हैं तो क्या होता है, इसके लिए इच्छुक व्यक्ति के लिए: 2GB RAM और 4GB स्वैप स्थान के साथ मेरे परीक्षण सिस्टम में RAM और स्वैप को भरने में लगभग 10 मिनट का समय लगा। ओओएम किलर ने अपना काम शुरू कर दिया और तीन मिनट बाद सभी तरह की प्रक्रियाएं मार दी गईं। यहां तक ​​कि माउस, कीबोर्ड और डिस्प्ले को सिस्टम ने गिरा दिया है। /var/log/kern.log कोई उपयोगी जानकारी नहीं दिखाती है, सिवाय उन प्रक्रियाओं के जो मारे गए हैं।
फोब्बर

हाहा, यह अद्भुत है! आपको उस विवरण को अपने उत्तर में संपादित करना चाहिए। +1
दरवाज़े

1
मैं नीचे नहीं गया, लेकिन यह अच्छा होगा अगर कोड को स्वरूपित किया जा सकता है ताकि टिप्पणियों को पढ़ने के लिए कोई क्षैतिज स्क्रॉल आवश्यक न हो।
पाओलो एबरमैन

2
+1 के लिए 1) प्रक्रियाओं के कारण इनपुट / आउटपुट डिवाइसेस को मार दिया जाता है और 2) एक प्रोग्राम बनाते हैं जो लॉग से ट्रैक करना मुश्किल होता है। यह मूंछ-कर्लिंग बुराई का स्तर है।
केविन -

29

शुद्ध बैश

फोर्क-बम नहीं, मैं वादा करता हूं:

:(){ : $@$@;};: :

यह एक कांटा बम की तरह दिखता है, और एक समान पुनरावर्ती तकनीक का उपयोग करता है, लेकिन कोई कांटा नहीं। बेशक, यह आपके शेल को मेमोरी से बाहर चला देगा, इसलिए आपको इस कमांड को चिपकाने से पहले एक नया शेल शुरू करने की सलाह दी जाती है।

  • एक फ़ंक्शन को परिभाषित करें :
  • फ़ंक्शन केवल पुनरावर्ती रूप से कॉल करता है $@(arg सूची) दोगुनी
  • फ़ंक्शन परिभाषा के बाद, फ़ंक्शन :को एक प्रारंभिक arg के साथ कहा जाता है:

आउटपुट:

$ bash
$ :(){ : $1$1;};: :
bash: xmalloc: ../bash/stringlib.c:135: cannot allocate 536870913 bytes (5368795136 bytes allocated)
$

इस उत्तर के पिछले संपादन में मैंने किया था a=$(yes), लेकिन मैंने नियम "प्रोग्राम को अन्य प्रोग्राम नहीं चलाना चाहिए" पर ध्यान दिया, इसलिए मुझे bashकिसी भी कोरुटिल या किसी अन्य चीज़ को कॉल किए बिना शुद्ध का उपयोग करने की आवश्यकता है।


यहाँ एक और है:

एक उत्पादन मशीन पर इस दौड़ मत करो

:(){ : <(:);};:

फिर, यह कांटा बम नहीं है - सब कुछ एक धागे के भीतर से चलाया जाता है। यह काफी हद तक मेरे उबंटू वीएम को अपने घुटनों तक लाने के लिए लगता है, जिसमें रिबूट के अलावा वसूली के लिए बहुत कम जगह है।

जैसा कि क्लासिक कांटा बम में, एक पुनरावर्ती कार्य :()परिभाषित किया गया है। हालांकि यह खुद को कॉल कांटा नहीं करता है। इसके बजाय यह खुद को एक तर्क के साथ कहता है, जिसे खुद एक प्रक्रिया प्रतिस्थापन में कहा जाता है । क्योंकि एक फ़ाइल डिस्क्रिप्टर को खोलने से प्रोसेस प्रतिस्थापन काम करता है /dev/fd/n, यह न केवल प्रक्रिया (बैश) मेमोरी को खाता है, यह कुछ कर्नेल मेमोरी भी खाएगा। मेरे उबंटू मशीन पर यह कुछ सेकंड के बाद विंडो मैनेजर को निष्क्रिय करने का प्रभाव है, फिर इस स्क्रीन के साथ समाप्त होने के तुरंत बाद:

यहाँ छवि विवरण दर्ज करें

क्लिक करने पर OKयह स्क्रीन देता है:

यहाँ छवि विवरण दर्ज करें

इन विकल्पों में से कोई भी विकल्प बहुत मददगार नहीं लगता है - इस बिंदु पर पुनः आरंभ करना एकमात्र अच्छा विकल्प लगता है।


3
$ which yes->/usr/bin/yes

2
"मेमोरी को जारी करने का एकमात्र तरीका कार्य प्रबंधक में प्रोग्राम को मारकर या टास्ककिल / im yourprogram / f का उपयोग करके या यहां तक ​​कि पीसी को पुनरारंभ करना है। इसे बंद करने के बाद भी इसे हॉग मेमोरी बनाना चाहिए।" >> बैश को एक SIGTERM का उपयोग करके समाप्त किया जा सकता है, इसलिए इसे चलाना बंद करने के लिए इसे मारना आवश्यक नहीं है। जब यह सिस्टम स्मृति से बाहर चलाता है, तो यह चलना बंद हो जाता है। एक बार बैश समाप्त हो जाने पर, या तो SIGTERM द्वारा या मेमोरी से बाहर चलाकर, मेमोरी को ऑपरेटिंग सिस्टम को वापस दिया जाता है।
फोबार

यह मेरे लिए काम नहीं करता ... तरह की ... मैं स्मृति को धीरे-धीरे दूर जाते हुए देख सकता हूं, लेकिन यह बहुत धीरे-धीरे होता है, और इसे सिर्फ ctrl + c दबाकर भी मारा जा सकता है। यह अब 1 मिनट के लिए चल रहा है और इस पर 1GB का कब्जा है। मेरे पास एक बहुत तेज़ मशीन है ... लेकिन यह बात नहीं होनी चाहिए, है ना?
स्टेफानोस कलंतज़िस

मेरी खुद की टिप्पणी का जवाब: कमांड ने वास्तव में लगभग 2mins 49sec के बाद बैश को मार दिया। मैंने मूल रूप से मान लिया कि यह इस उत्तर के आधार पर तत्काल होने वाला है।
स्टेफानोस कलंतज़िस

@StefanosKalantzis आपकी टिप्पणी के लिए धन्यवाद। इसने मुझे थोड़ा और सोचने पर मजबूर कर दिया और मुझे बस एक और भी बुरी शेल स्निपेट मिली - देखें संपादित करें।
डिजिटल ट्रामा

24

एक्सएमएल

<!DOCTYPE boom [
<!ENTITY Z 'ka-boom!'><!ENTITY Y '&Z;&Z;'><!ENTITY X '&Y;&Y;'><!ENTITY W '&X;&X;'>
<!ENTITY V '&W;&W;'><!ENTITY U '&V;&V;'><!ENTITY T '&U;&U;'><!ENTITY S '&T;&T;'>
<!ENTITY R '&S;&S;'><!ENTITY Q '&R;&R;'><!ENTITY P '&Q;&Q;'><!ENTITY O '&P;&P;'>
<!ENTITY N '&O;&O;'><!ENTITY M '&N;&N;'><!ENTITY L '&M;&M;'><!ENTITY K '&L;&L;'>
<!ENTITY J '&K;&K;'><!ENTITY I '&J;&J;'><!ENTITY H '&I;&I;'><!ENTITY G '&H;&H;'>
<!ENTITY F '&G;&G;'><!ENTITY E '&F;&F;'><!ENTITY D '&E;&E;'><!ENTITY C '&D;&D;'>
<!ENTITY B '&C;&C;'><!ENTITY A '&B;&B;'><!ENTITY z '&A;&A;'><!ENTITY y '&z;&z;'>
<!ENTITY x '&y;&y;'><!ENTITY w '&x;&x;'><!ENTITY v '&w;&w;'><!ENTITY u '&v;&v;'>
<!ENTITY t '&u;&u;'><!ENTITY s '&t;&t;'><!ENTITY r '&s;&s;'><!ENTITY q '&r;&r;'>
<!ENTITY p '&q;&q;'><!ENTITY o '&p;&p;'><!ENTITY n '&o;&o;'><!ENTITY m '&n;&n;'>
<!ENTITY l '&m;&m;'><!ENTITY k '&l;&l;'><!ENTITY j '&k;&k;'><!ENTITY i '&j;&j;'>
<!ENTITY h '&i;&i;'><!ENTITY g '&h;&h;'><!ENTITY f '&g;&g;'><!ENTITY e '&f;&f;'>
<!ENTITY d '&e;&e;'><!ENTITY c '&d;&d;'><!ENTITY b '&c;&c;'><!ENTITY a '&b;&b;'>
]>
<boom a="&a;"/>

फिर दस्तावेज़ को एक XML पार्सर के पास दें जो एंट्री रेफरेंस लूप / रिकर्सन डिटेक्शन नहीं करता है। उदाहरण के लिए, xpathपर्ल के साथ शामिल:

xpath boom.xml /

यह काम किस प्रकार करता है:

  1. पार्सर का सामना होता है <boom a="&a;">
  2. पार्सर में विस्तार होता "&a;"है"&b;&b;"
  3. पार्सर में से एक का विस्तार "&b;"में "&c;&c;"(वापसी पर, यह अन्य का विस्तार होगा "&b;")
  4. पार्सर "&c;"आदि में से एक का विस्तार करता है ...

यदि पूर्ण विस्तार हो सकता है, तो "का-बूम" का 2 ^ 52 विस्तार होगा। प्रति चरित्र 2-बाइट्स मानते हुए, यह 64 PiB का उपयोग करने का प्रयास करेगा। विस्तार "का-बूम!" एक समय में, इसलिए आप आमतौर पर यह देख सकते हैं कि यह शीर्ष में सभी मेमोरी का उपयोग करता है।

यह विभिन्न नामों से जाता है, यहाँ अच्छा अवलोकन: http://projects.webappsec.org/w/page/13247002/XML%20Entity%20Expansion


3
अनिवार्य रूप से बिलियन लाफ़्स
कोल जॉनसन

@ColeJohnson हाँ यह है! मैंने WASC खतरा वर्गीकरण परियोजना में योगदान दिया, इसलिए मैंने विकिपीडिया के बजाय WASC को इंगित करने के लिए बाध्य महसूस किया। :)
euroburɳ

22

सी ++

int main()
{
    for(;;)int *a=new int;
}

यह कोड अप्रत्याशित था! यह मेरा कंप्यूटर लटका हुआ था जब कार्य प्रबंधक खुला था और दिखाया गया था कि 1 सेकंड में 890 एमबी की मेमोरी ली थी, फिर इसे भी लटका दिया। मुझे नहीं पता कि यह कैसे काम करता है, शायद यह एक चर को मेमोरी देता रहता है। इस कोड का अधिक पता लगाने के लिए मैंने एक बयान जोड़ा delete a;और परीक्षण करते समय हर चीज ठीक थी (फांसी नहीं) इसलिए, मुझे लगता है कि स्मृति का हिस्सा दिए गए ( new int) के कारण और फिर delete aनीचे दिए गए नए कोड में खाली स्थान के कारण वापस ले लिया गया ।

int main()
{
    for(;;)
    {
         int *a=new int;
         delete a;
    }
}  

इसलिए, मुझे लगता है कि इस दुनिया में कोई राम इस कोड को खत्म नहीं कर सकता है !!!

संपादित करें : लेकिन कई प्रोसेसर उदाहरण के लिए intel core 2 duoइस कोड को संभाल नहीं सकते हैं लेकिन
intel core i-seriesमेरे लिए काम कर सकते हैं ...)

याद रखें कि प्रश्न का उत्तर 1 कोड है, दूसरा स्पष्टीकरण के लिए है।


9
अच्छा, संकलक आपको लगता है कि आप अभी भी उपयोग करने जा रहे हैं, new intभले ही आप पॉइंटर को ओवरवोट करते हैं, इसलिए आप इसे फिर से एक्सेस नहीं कर सकते ... इसलिए कोई कचरा संग्रह नहीं कहा जाता है और आप एक बच्चे की तुलना में तेजी से मेमोरी भरते हैं, जो स्किटल्स खाती है
डेविड किस्किन्स

37
@DavidWilkins: ... यह C ++ है, C ++ में कोई कचरा संग्रहकर्ता नहीं है।
फोशी

32
यदि यह आपके लिए अनपेक्षित है कि यह कोड लीक है, तो मुझे लगता है कि आपको C ++ का उपयोग नहीं करना चाहिए जब तक कि आप इसे बेहतर नहीं सीखते।
13

1
@svick लेकिन यह भी अंधेरे में डार्ट-बोर्ड मारने की तरह नहीं है! मेरे पास कुछ आइडिया था कि यह वह काम करेगा जो सवाल चाहता है।
मुकुल कुमार

15
अगर वह 'C ++ का उपयोग नहीं करना चाहिए' तो वह कैसे 'इसे बेहतर तरीके से सीखेगा' यह माना जाता है?
केविन

16

BrainFuck

+[>+]

स्पष्टीकरण:

लूप में प्रवेश करने के लिए यह सेल को 1 तक बढ़ाता है। यह अगले सेल तक बढ़ जाता है जो कि 1 तक रहता है जब तक कि अंतिम सेल सकारात्मक था।

आमतौर पर ए ब्रेनफैक दुभाषिया टेप पर कोशिकाओं की संख्या के लिए एक कठिन सीमा होने के साथ त्रुटिपूर्ण है, लेकिन कुछ दुभाषियों को गतिशील रूप से जोड़ता है। ये तब तक मेमोरी का उपभोग करते रहेंगे जब तक कि इसका सेवन करना अधिक न हो।

beefऐसा ही एक दुभाषिया है और यह उबंटू सॉफ्टवेयर सेंटर में उपलब्ध है और एक अप्रयुक्त मशीन पर मेरा वर्तमान रन 29 घंटे पहले शुरू हुआ था और उस समय में 1 जीबी रैम की खपत हुई थी। यहाँ का आउटपुट हैtop

PID  USER        PR  NI  VIRT  RES  SHR S  %CPU %MEM    TIME+  COMMAND  
2978 sylwester   20   0 1030m 984m 2536 R 100,1 12,4   1750:52 beef

इसमें 4GB कैश और 6GB स्वैप है तो मुझे लगता है कि मैं इस जवाब को अपडेट करूंगा कि यह लगभग 12 दिनों में कैसे चला गया।

अद्यतन 03.24 17:11

PID  USER        PR  NI  VIRT  RES  SHR S  %CPU %MEM    TIME+  COMMAND  
2978 sylwester   20   0 1868m 1,8g 2456 R  99,9 22,9   6008:18 beef    

अद्यतन 03.31 00:20

PID  USER        PR  NI  VIRT  RES  SHR S  %CPU %MEM    TIME+  COMMAND  
2978 sylwester   20   0 2924m 2,8g 2052 R 100,0 36,1  15019:46 beef   

इसलिए यह 10 दिनों से चल रहा है। ऐसा लगता है कि कुछ दिलचस्प होने से पहले कम से कम 10 और के लिए चल रहा होगा।


अच्छा और छोटा।
nrubin29

15

C और POSIX

यहां मैं एक अत्यधिक पोर्टेबल समाधान के लिए लक्ष्य कर रहा हूं। समस्या यह है कि शुद्ध C को ऑपरेटिंग सिस्टम को यह बताने का कोई तरीका नहीं है कि प्रोग्राम बंद होने के बाद मेमोरी आवंटित की जानी चाहिए। इसलिए मैं खुद को POSIX का उपयोग करने की अनुमति देता हूं; अधिकांश OS के पास विंडोज, लिनक्स और मैकओएस एक्स सहित POSIX संगतता के लिए कुछ दावा है। हालांकि, मैंने केवल इसे Ubuntu 12.04 कक्षा पर परीक्षण किया है। इसके लिए सुपरसिर की अनुमति की आवश्यकता नहीं है।

यह समाधान मूल रूप से पारंपरिक while(1){malloc(1);}समाधान है। हालांकि, मॉलॉक के बजाय, यह POSIX साझा मेमोरी फ़ंक्शन का उपयोग करता है। चूंकि यह प्रत्येक आवंटन के लिए एक साझा मेमोरी पहचानकर्ता प्रदान करता है, प्रक्रिया समाप्त होने के बाद भी मेमोरी तक पहुंचना अभी भी संभव है। इस प्रकार कर्नेल मेमोरी को मुक्त नहीं कर सकता है।

#include <sys/types.h>
#include <sys/shm.h>
#include <string.h>

#define SHMSZ (2*1024*1024) /*Ubuntu rejects shared allocations larger than about 2MiB*/

main() {
  int shmid;
  key_t key = 0xF111; /* Lets use `Fill' as our first ID.*/
  char *shm;

  while(1) { /* Like malloc, but using shared memory */
    if ((shmid = shmget(key, SHMSZ, IPC_CREAT|0666)) < 0){return 1;}/*Get shared memory*/
    if ((shm = shmat(shmid, NULL, 0)) == (void *) -1) { return 1; } /*Attach it        */
    memset(shm,0,SHMSZ);                                            /*Fill it up       */
    key++                                                           /*On to the next ID*/
  }
}

सर्वश्रेष्ठ और सबसे शानदार सी उत्तर IMO। +1
syb0rg

1
अच्छा है। पहला समाधान मैं एंड्रयू मेडिको के साथ आया था, लेकिन जैसा कि लिनक्स पर संभव नहीं है और जैसा कि मुझे विंडोज प्रोग्रामिंग पसंद नहीं है, मैं साझा मेमोरी के माध्यम से लीक करना चाहता था, लेकिन पोसिक्स फ़ंक्शन नामों को याद नहीं कर सका। उनमें से मुझे याद करने के लिए धन्यवाद;) मैंने पाया कि केवल मिमीप सामान था जो प्रक्रिया समाप्ति पर अनमैप है ...
फोबार

14

सी#

हैंडलर के दायरे से बाहर जाने से पहले घटनाओं से अनसब्सक्राइब करना भूल जाएगा। .NET मेमोरी को लीक करने का कारण बनेगा, जब तक कि यह आउटऑफमैमोरी एक्ससेप्शन को फेंक न दे।

using System;

class A
{
    public event Action Event;
}

class B
{
    public void Handler() { }
}

class Program
{
    static void Main()
    {
        A a = new A();

        while( true )
            a.Event += new B().Handler;
    }
}

स्पष्टीकरण : whileलूप के अंदर , हम एक नई वस्तु का निर्माण करते हैं, जिससे फ्रेमवर्क अधिक मेमोरी आवंटित करता है, लेकिन हम नए उदाहरण को Bरिलीज़ होने से रोकते हैं जब यह एक अलग श्रेणी में एक घटना के लिए एक इंस्टेंस विधि को असाइन करके दायरे से बाहर हो जाता है, परिणाम यह है कि नया उदाहरण Bहमारे कोड से अनुपलब्ध हो जाता है, लेकिन एक संदर्भ अभी भी मौजूद है, जिसका अर्थ है कि जीसी इसे तब तक जारी नहीं करेगा जब तक कि aयह दायरे से बाहर न हो जाए।

स्टेटिक इवेंट्स में एक ही नुकसान होता है, क्योंकि वे कभी भी दायरे से बाहर नहीं जाते हैं, वे केवल तभी साफ होते हैं जब प्रक्रिया समाप्त हो जाती है, जब तक कि आप पहले इवेंट से अनसब्सक्राइब नहीं करते। हमेशा अपने संदर्भों को स्टोर करें, लोग!

using System;

class Program
{
    static event Action Event;

    static void Main()
    {
        while( true )
            Event += new Action( delegate{ } );
    }
}

उपरोक्त एक ही विचार पर काम करता है, एक बार whileलूप स्कोप से बाहर निकल जाने के बाद हैंडलर अगम्य हो जाता है, जिससे घटना से अनसब्सक्राइब करना असंभव हो जाता है, जिसका अर्थ है कि प्रोग्राम समाप्त होने तक मेमोरी वहीं बैठेगी। उदाहरण की घटनाओं की तुलना में स्थिर घटनाएं यकीनन अधिक खतरनाक होती हैं, क्योंकि आप यह सुनिश्चित कर सकते हैं कि वे कभी भी दायरे से बाहर नहीं जा सकते हैं।

संपादित करें : आप मूल रूप से किसी भी अन्य ऑब्जेक्ट के साथ भी ऐसा ही कर सकते हैं, जब तक आप एक संदर्भ जोड़ते हैं, जबकि एक ही समय में यह सुनिश्चित करते हैं कि उस संदर्भ को मुक्त करने का कोई तरीका नहीं है।

यहाँ एक उदाहरण है जो स्थैतिक वस्तुओं और सरणियों का उपयोग करता है।

using System;
using System.Collections.Generic;

static class Leak
{
    private static List<decimal[]> Junk;

    static Leak()
    {
        Junk = new List<decimal[]>();
    }

    public static void Add( uint size )
    {
        decimal[] arr = new decimal[size];
        Junk.Add( arr );
    }
}

class Program
{
    static void Main()
    {
        while( true )
            Leak.Add( 1 );
    }
}

एरे को सूची में जोड़ा जा रहा है, लेकिन कोड को संशोधित किए बिना सूची को खाली करने का कोई तरीका नहीं है, जो बंद-स्रोत अनुप्रयोगों के लिए असंभव होगा। पास की गई संख्या को बढ़ाकर Leak.Addइसे तेजी से लीक करने का कारण होगा, यदि आप इसे पर्याप्त रूप से सेट करते हैं तो यह सिर्फ एक तत्काल ओवरफ़्लो अपवाद में परिणाम होगा।


10

बैश (कोई बाहरी उपयोगिताओं नहीं)

यहां कोई कांटा बम नहीं।

चेतावनी: यह आपके खोल को मार सकता है।

केवल संदर्भ के लिए पूर्णांकों की एक सरणी बनाने की कोशिश कर रहा हूं क्योंकि मैं भूल रहा हूं कि पूर्णांक कैसे दिखते हैं।

while :; do _+=( $((++__)) ); done

का परिणाम:

xmalloc: expr.c:264: cannot allocate 88 bytes (268384240 bytes allocated)

2
+1 के लिए "क्योंकि मैं यह भूलता रहता हूं कि पूर्णांक कैसे दिखते हैं" :)
डेविड कॉनरैड

8

जे (7)

चेतावनी: जब मैंने इसे आज़माया, तो यह मेरी प्रणाली को खराब कर देता है (विंडोज 8, जे 8.01, क्यूटी टर्मिनल में)।

2#^:_[_
  • 2# प्रत्येक तत्व को डुप्लिकेट करके तर्क की लंबाई दोगुनी करता है,
  • ^:_ दिए गए फ़ंक्शन का फ़िक्सपॉइंट ढूंढता है (लेकिन कोई ऐसा नहीं है जो इसे अंतहीन रूप से लूप करता है),
  • [_इसे _तर्क के रूप में कहते हैं।

8

हास्केल (ग्राहम का नंबर)

यह बहुत सरल है: यह ग्राहम की संख्या की गणना करता है

यहां अन्य उदाहरणों के विपरीत, यह हमेशा के लिए नहीं चलेगा ... यह बहुत सारे सीपीयू का उपयोग करेगा, लेकिन सैद्धांतिक रूप से इसे समाप्त कर सकता है। यदि यह इस तथ्य के लिए नहीं था कि संख्या को संग्रहीत करने के लिए ...

अवलोकन योग्य ब्रह्मांड ग्राहम की संख्या का एक साधारण डिजिटल प्रतिनिधित्व शामिल करने के लिए बहुत छोटा है, यह मानते हुए कि प्रत्येक अंक एक प्लैंक मात्रा पर कब्जा करता है ।

(विकिपीडिया के अनुसार)

import Data.Sequence
import Data.Foldable

(↑) a 1 b = a ^ b
(↑) a _ 0 = 1
(↑) a i b = a ↑ (i-1) $ a ↑ i $ b-1

graham = last $ toList $ iterateN 64 (\i -> 3 ↑ i $ 3) 4
main = print graham

तो, यह विचार यह है कि मेमोरी का उपयोग एक (तेजी से बढ़ने वाली) श्रृंखला के द्वारा किया जाएगा। Integer(हस्केल के एंगर्स मनमाने आकार के हैं)।

यदि आप इसका परीक्षण करना चाहते हैं, तो आपको स्टैक का आकार बढ़ाना पड़ सकता है या इसे अंदर लोड करना पड़ सकता है ghci


2
गूंगा ब्रह्मांड, पूर्णांक के लिए हस्केल मानक के अनुरूप नहीं है। यह मनमाने आकार का समर्थन क्यों नहीं कर सकता है?
PyRulez

6

@Comintern से प्रेरित है।

प्रतिस्थापित / देव / अशक्त। डरपोक मोड से जुड़ना। कर्नेल हेडर, सुपरयुसर मोड और एक वर्किंग कंपाइलर की आवश्यकता होती है।

# make
# rm /dev/null
# insmod devnull.ko
# chmod go+rw /dev/null

मज़े करो।

makefile:

MODULE := devnull
KVERS  ?= $(shell uname -r)
KDIR   ?= /lib/modules/$(KVERS)/build
KMAKE := make -C $(KDIR) M=$(PWD)

obj-m += $(MODULE).o

all:
    $(KMAKE) modules

install:
    $(KMAKE) modules_install

clean:
    $(KMAKE) clean

सोर्स कोड:

#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/fs.h>
#include <linux/ioport.h>
#include <linux/device.h>
#include <linux/version.h>
#include <linux/slab.h>
#include <asm/io.h>
#include <asm/uaccess.h>

#define DEVICE_NAME "null"
#define MAJOR_NUMBER 0

MODULE_LICENSE("GPL");
MODULE_AUTHOR("nola <florian@n0la.org>");
MODULE_DESCRIPTION("/dev/null - memory leak style");
MODULE_VERSION("0.1");
MODULE_SUPPORTED_DEVICE("null");

static struct class *class_null;
static int major = 0;

static int device_open(struct inode *, struct file *);
static int device_release(struct inode *, struct file *);
static ssize_t device_read(struct file *, char *, size_t, loff_t *);
static ssize_t device_write(struct file *, const char *, size_t, loff_t *);
static loff_t device_llseek(struct file *, loff_t, int);

static struct file_operations fops = {
    .owner = THIS_MODULE,
    .llseek = &device_llseek,
    .read = &device_read,
    .write = &device_write,
    .open = &device_open,
    .release = &device_release
};

static int __init mod_init(void)
{
    struct device *dev_null;

    if ((major = register_chrdev(MAJOR_NUMBER, DEVICE_NAME, &fops)) < 0) {
        return major;
    }

    /* create /dev/null
     * We use udev to make the file.
     */
    class_null = class_create(THIS_MODULE, DEVICE_NAME);
    if (IS_ERR(class_null)) {
        unregister_chrdev(major, DEVICE_NAME);
        return -EIO;
    }

#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 27)
    dev_null = device_create(class_null, NULL, MKDEV(major, 0),
                             NULL, "%s", DEVICE_NAME
        );
#else
    dev_null = device_create(class_null, NULL, MKDEV(major, 0),
                             "%s", DEVICE_NAME
        );
#endif
    if (IS_ERR(dev_null)) {
        class_destroy(class_null);
        unregister_chrdev(major, DEVICE_NAME);
        return -EIO;
    }

    return 0;
}

static void __exit mod_exit(void)
{
    device_destroy(class_null, MKDEV(major, 0));
    class_unregister(class_null);
    class_destroy(class_null);
    unregister_chrdev(major, DEVICE_NAME);
}

static int device_open(struct inode *inode, struct file *file)
{
    file->f_pos = 0x00;

    try_module_get(THIS_MODULE);
    return 0;
}

static int device_release(struct inode *inode, struct file *file)
{
    /* decrement usage count: Not. Uncomment the line for less fun. */
    /* module_put(THIS_MODULE); */
    return 0;
}

static loff_t device_llseek(struct file *filep, loff_t offs, int mode)
{
    loff_t newpos;

    switch (mode) {
    case 2:
    case 0:
        newpos = offs;
        break;

    case 1:
        newpos = filep->f_pos + offs;
        break;

    default:
        return -EINVAL;
    }

    if (newpos < 0) {
        return -EINVAL;
    }

    filep->f_pos = newpos;

    return newpos;
}

static ssize_t device_read(struct file *filep, char *dst, size_t len,
                           loff_t *off)
{
    char *buf = NULL;

    if (dst == NULL || len == 0) {
        return -EINVAL;
    }

    buf = kmalloc(sizeof(char) * len, GFP_KERNEL);
    if (buf == NULL) {
        return -EINVAL;
    }

    /* Do how a /dev/null does.
     */
    memset(dst, 0, len);

    *off += len;
    return len;
}

static ssize_t device_write(struct file *filep, const char *src, size_t len,
                            loff_t *off)
{
    char *buf = NULL;

    buf = kmalloc(sizeof(char) * len, GFP_KERNEL);
    if (buf == NULL) {
        return -EINVAL;
    }

    *off += len;
    return len;
}

module_init(mod_init);
module_exit(mod_exit);

चेतावनी यह आपको रिबूट करने के लिए मजबूर कर सकती है!

इसे हटाने के लिए:

# rmmod -f devnull # or a reboot
# rm -rf /dev/null
# mknod /dev/null c 1 3
# chmod go+rw /dev/null

6

माणिक

सभी जानते हैं कि राशि (1 / n ^ 2) = pi ^ 2/6

तो मैं एक अनुमान कार्य को परिभाषित कर सकता हूं:

pi_approx = lambda {|i|
Math.sqrt( 
  6*( 
    (1...Float::INFINITY).map{|n| n.to_f**(-2)}.take(i).reduce(:+)
    )
  )
}

p pi_approx.(100_000)

बेशक (1..infinity) जंगली चलेगा।

हालाँकि, ध्यान दें कि आलसी का उपयोग करने से यह काम हो जाएगा;)

pi_approx = lambda {|i|
Math.sqrt( 
  6*( 
    (1...Float::INFINITY).lazy.map{|n| n.to_f**(-2)}.take(i).reduce(:+)
    )
  )
}

p pi_approx.(100_000)
#=> 3.141583104326456

5

सी - (२५ अक्षर (पूर्ण कार्यक्रम)

उस एक को न चलाएं, या आपका सिस्टम जल्दी से जमेगा!

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

मॉलॉक के लिए कॉल 9 बाइट्स मेमोरी को आरक्षित करेगा और नियमित रूप से ऑपरेटिंग सिस्टम से नए मेमोरी पेज का अनुरोध करेगा। मैलोक द्वारा आवंटित मेमोरी तुरंत लीक हो जाती है क्योंकि लौटे पते पर कोई पॉइंटर नहीं जमा होता है। एक बार जब सिस्टम मेमोरी से बाहर चला जाता है (रैम और स्वैप स्पेस) या प्रक्रिया के लिए मेमोरी की सीमा पूरी हो जाती है, तो प्रोग्राम समय-लूप से बाहर निकल जाएगा और समाप्त हो जाएगा।


2
लंबे समय के लिए नहीं - किसी भी कारण से आधुनिक प्रणाली में एक ओओएम हत्यारा होना चाहिए जो प्रक्रिया को मारता है और मारता है। कम से कम Ubuntu 12.04 करता है।
डिजिटल ट्रामा

1
खैर, मैंने इस कोड को आज़माते हुए अपने Ubuntu को 13.10 पर क्रैश कर दिया ...
Mathieu Rodic

@DigitalTrauma करता है जैसे FreeBSD में OOMK होता है?
रुसलान

1
main(){while(malloc(9));}एक और 3 अक्षर बचाता है, और मेरी स्मृति को बहुत तुरंत भर देता है।
गमथ

@gmatht: सुझाव के लिए धन्यवाद! मैंने उत्तर को संपादित किया ... हालांकि मुझे हर लूप पर ब्लॉक का आकार बढ़ाने का विचार पसंद आया।
मैथ्यू रोडिक

4

VBScript

do
    Set d1 = createobject("Scripting.Dictionary")
    d1.add true, d1
    Set d1 = Nothing
loop

हम एक ऐसा द्वंद्व पैदा कर रहे हैं जो खुद को इंगित करता है। फिर हम सोचते हैं कि हम डिक्शनरी को नथिंग सेट करके नष्ट करते हैं। हालाँकि, शब्दकोश अभी भी स्मृति में मौजूद है क्योंकि इसका एक मान्य (परिपत्र) संदर्भ है।

लूप, लेकिन मेमोरी हॉग भी प्रोग्राम को लटका देता है। कार्यक्रम के बंद होने के बाद, मेमोरी अभी भी उपयोग में है। इसे पुनः आरंभ करके प्रणाली को केवल बहाल किया जा सकता है।


उह, वास्तव में? VBScript सिर्फ हुड के नीचे VB.NET का उपयोग नहीं करता है? साधारण संदर्भ गणना के कार्यान्वयन को छोड़कर, सर्कुलर संदर्भ आमतौर पर कचरा बीनने वालों के लिए समस्या नहीं हैं, और कार्यक्रम को समाप्त करने के परिणामस्वरूप इसके पूरे ढेर को जारी करना चाहिए , नहीं?
डेविड कॉनरैड

@DavidConrad आप ऐसा सोचते होंगे, लेकिन मुझे हर बार अपनी मशीन को पुनरारंभ करना पड़ा और मैंने इस प्रकार की स्क्रिप्ट को चलाया।
ऑटोमेटेडचौस

1
VBScript VB.Net से काफी पहले से है - यह VB.Net का कमांड लाइन संस्करण नहीं है; यह विरासत विजुअल बेसिक की व्याख्या की गई सबसेट है।
क्रिस जे

आप दोनों को शुक्रिया। मुझे महसूस नहीं हुआ कि VBScript और VB.NET के बीच क्या संबंध था।
डेविड कॉनरेड

4

हाँ और tmpfs

जब एक उबंटू के साथ मुफ्त में आता है तो एक नया कार्यक्रम क्यों लिखें?

yes > /run/user/$UID/large_file_on_my_ramdisk

जैसा कि आप शायद जानते हैं, या पहले से ही अनुमान लगा चुके हैं, उबंटू mounts / run / user / डिफ़ॉल्ट रूप से एक tmpfs के रूप में है जो RAM डिस्क का एक प्रकार है ।

आपको इसे बंद भी नहीं करना है। यह विनम्रता से खुद को बंद कर देगा, स्मृति का एक अच्छा हिस्सा आवंटित किया जाएगा। मुझे लगता yesहै कि एक एकल-थ्रेडेड, एकल-प्रक्रिया कार्यक्रम है जो किसी अन्य को कॉल नहीं करता है (मौजूदा रैम डिस्क पर लिखना आपकी पसंद की भाषा के लिए भी बहुत पोर्टेबल है)।

इसमें एक छोटा बग है: उबंटू डिफ़ॉल्ट रूप से उपयोगकर्ता के योग्य tmpfs / run / 1000 से 100 MB को सीमित करता है, इसलिए हो सकता है कि स्वैप मौत सुविधा आपके मशीन के आउट-ऑफ-द-बॉक्स पर समर्थित न हो। हालाँकि मैं निम्नलिखित त्वरित समाधान के साथ अपनी मशीन पर इसे ठीक करने में कामयाब रहा:

sudo mount -o remount,size=10G tmpfs /run/user/

मेरे पास बिल्कुल /run/userनिर्देशिका नहीं है । उबंटू के किस संस्करण का आप उपयोग करते हैं और आपने इसके लिए क्या स्थापित किया है?
रुसलान

उबंटू ट्रस्टी तहर (14.04)। कोई विशेष इंस्टॉल की आवश्यकता नहीं है।
गमथ

यह जानने के लिए कि क्या आपके पास कोई tmpfsफ़ाइल सिस्टम माउंट है, आप उन्हें सूचीबद्ध कर सकते हैं df -t tmpfs। मेरे उबंटू प्रणाली में एक सुंदर बड़ा /run/shmउपलब्ध है ...
टोबी स्पाइट

4

दे घुमा के

चेतावनी: निम्न कोड आपके कंप्यूटर को अनबूटेबल बना देगा।

printf "\\xe8\\xfd\\xff" | dd of=/dev/sda
reboot

चेतावनी: पूर्ववर्ती कोड आपके कंप्यूटर को अप्राप्य बना देगा।

अपने बूट ड्राइव के साथ बदलें / देव / एसडीए। यह आपके बूट सेक्टर के भीख मांगने के लिए E8 FD FF लिखता है। बूट करते समय, BIOS आपके बूट सेक्टर को मेमोरी में पढ़ता है और इसे निष्पादित करता है। वे ऑपकोड इस विधानसभा के बराबर हैं:

label:
  call label

यह अनंत पुनरावृत्ति है, जो अंततः एक ढेर अतिप्रवाह का कारण होगा।


आपके विधानसभा उदाहरण में, आप एक चरित्र को बचा सकते हैं (नाम "लेबल" आवश्यक है) jmpइसके बजाय का उपयोग करकेcall
SirPython

कॉल रिट के लिए स्टैक पर रिटर्न एड्रेस छोड़ता है। कूद एक ढेर अतिप्रवाह का कारण नहीं होगा।
जेरी यिर्मयाह

3

हास्केल

main=print $ sum [0..]

यह गिनती की संख्या को जोड़ने की कोशिश करता है। हास्केल आंशिक रकम का मूल्यांकन करता है, यह सिर्फ एक अनंत जोड़ बयान बन जाता है। यदि आप कंपाइलर को अनुकूलन झंडे के साथ चलाते हैं, तो यह काम नहीं कर सकता है।


3

दे घुमा के

चूंकि हम उपयोगिताओं का उपयोग कर सकते हैं जो विशेष रूप से स्मृति का उपभोग करने के लिए डिज़ाइन नहीं किए गए हैं, मैं मुफ्त मेमोरी की उपयोगिता पर ध्यान केंद्रित करता हूं swapon:। इसका उपयोग कर्नेल को डिस्क पर लिखकर मेमोरी को खाली करने की अनुमति देने के लिए किया जाता है।

यह स्क्रिप्ट दो अनुकूलन करती है: (1) बढ़ते tmp को tmpfs (RAM डिस्क का एक प्रकार) के रूप में तेज / tmp बनाने के लिए और (2) मेमोरी को खाली करने के लिए एक स्वैफ़ाइल का निर्माण। इनमें से प्रत्येक अपने आप से उचित है लेकिन अगर कोई लापरवाह उपयोगकर्ता दोनों करता है तो यह स्वैपिंग का एक चक्र स्थापित करता है: जब ओएस पृष्ठों को स्वैप करने की कोशिश करता है, तो यह tmpfs को लिखता है; इससे tmpfs अधिक मेमोरी का उपयोग करता है; इससे मेमोरी प्रेशर बढ़ जाता है जिसके कारण अधिक पेज स्वैप हो जाते हैं। यह आपके वीएम पर कुछ मिनट ले सकता है, आपके लिए सिस्टम को देखने के लिए बहुत समय लगता है top

कार्यक्रम को बंद करने से बहुत कम फर्क पड़ता है क्योंकि कार्यक्रम स्वयं को शायद ही कोई स्मृति आवंटित करता है। वास्तव में यह मुक्त स्मृति के लिए तुच्छ नहीं है क्योंकि आप स्वैप करने से पहले tmpfs को अनमाउंट करके स्मृति को मुक्त नहीं कर सकते हैं swapoff, और जब तक आप स्मृति को मुक्त नहीं करते हैं तब तक यह करना मुश्किल है।

इस जवाब को बिना उनकी समझ के नेट से कूल ट्रिक्स लगाने के खिलाफ एक सतर्क कहानी माना जा सकता है।

sudo mount -t tmpfs -o size=9999G tmpfs /tmp # Use tmpfs to make /tmp faster
truncate -s 4096G /tmp/swap                  # Now make a giant swap file to free up memory 
sudo losetup /dev/loop4 /tmp/swap            # Use a loopback so we can mount the sparse file
sudo mkswap /dev/loop4
sudo swapon /dev/loop4
#The following line would cause a quick swap death, but isn't needed.
#dd if=/dev/zero of=/tmp/zero bs=1          # Zero the tmp dir so the VM can free more memory

2

पर्ल

sub _ {
  my($f,$b);
  $f=\$b;$b=\$f;
}
while(1) { _;}

परिपत्र संदर्भ का उपयोग करता है। चरों के लिए संदर्भ गणना कभी 0 तक नहीं पहुंचेगी, और संदर्भ कभी भी कचरा एकत्र नहीं किया जाएगा।

आपको धैर्य रखने की आवश्यकता हो सकती है, लेकिन यह आपके सिस्टम को चोक करने की गारंटी है। डिस्क तेजी से घूमना शुरू कर देगी और धुएं दिखाई दे सकती है।


2

PHP (केवल linux):

यह कोड अप्रयुक्त है, क्योंकि मेरे पास php रनिंग के साथ एक लिनक्स कंप्यूटर नहीं है।

लेकिन यह मेरी अवधारणा का प्रमाण है:

ignore_user_abort(true);
ini_set('memory_limit',-1);
ini_set('max_execution_time',0);
/*
    sets php to ignore if the script was canceled in the browser
    (like clicking cancel or closing the browser)
    and takes away the memory limit,
    as well as the maximum execution time.
*/

function dont_let_it_stop(){shell_exec('php '.__FILE__.' &');}
//this function calls the file itself.

register_shutdown_function('dont_let_it_stop');
//this function will register the function declared above to be used when the script is being terminated

function get_info($f='current')
{
    return str_replace(' kB','',end(explode(':',trim($f(explode(PHP_EOL,file_get_contents('/proc/meminfo')))))))*1024
}
/*
    this function fetches the infos
    'current' fetches the max memory
    'next' fetches the actual used memory
*/

$max=get_info();//maximum memory
$current=get_info('next');//current memory

$imgs=array(imagecreatetruecolor(1e4,1e4));
$color=imagecolorallocatealpha($imgs[$i=0],128,128,128,126);
imagefill($imgs[$i],0,0,$color);
/*
    this creates an array and inserts one image (10000x10000 pixels),
    filling it then with a solid transparent color
*/

$total-=get_info('next');//calculates the space an image takes

while($max-get_info('next')>$total*2)//while the free memory is higher than the memory of 2 images, fill the array
{
    $imgs[$i++]=imagecreatetruecolor(1e4,1e4);
    $color=imagecolorallocatealpha($imgs[$i-1],128,128,128,126);
    imagefill($imgs[$i-1],0,0,$color);
}

//this is just to keep the images in memory, so the script doesn't end
while(1)sleep(60);

यह मेमोरी को बड़े RGBA इमेज (10000x10000 पिक्सल) से भरेगा।

इस बच्चे को बंद करने का एकमात्र तरीका शक्ति को बंद करना है।

कोड सभी टिप्पणी की है।

कोई भी सुधार, संदेह, बग या कुछ भी, नीचे टिप्पणी बॉक्स का उपयोग करें।


क्या कोई ऐसा व्यक्ति होगा जिसके पास linux mind का परीक्षण है? धन्यवाद :)
जॉर्ज

मेरे पास लिनक्स है, मुझे यकीन नहीं है कि यह कैसे काम करेगा। मैंने 1 उत्तर के लिए प्रिंटस्क्रीन प्रदान की, लेकिन यह पिल्ला लाइनक्स का एक बहुत पुराना संस्करण है। Ubuntu, php चलाने के लिए बहुत धीमा है। हो सकता है कि मैं बाद में अपने Android पर परीक्षण करूं।
इस्माइल मिगुएल

1
यह एक और कार्यक्रम नहीं बुलाने के बारे में बात को विफल करता है
एनानासियो

यह दूसरे प्रोग्राम को कॉल नहीं कर रहा है: यह उसी प्रोग्राम को कॉल कर रहा है जिसने उसी फाइल के लिए फाइल शुरू की है।
इस्माइल मिगुएल

2

अजगर - 56

class x:
 def __setattr__(self,*args):self.y=0
x().y=0

एक वर्ग बनाता है, विशेषताओं को सेट करने के लिए एक विधि को परिभाषित करता है, उसमें एक विशेषता निर्धारित करता है, और एक प्रारंभिक उदाहरण बनाता है जिसे वह फिर एक विशेषता सेट करने का प्रयास करता है।

एक साधारण पुनरावर्ती क्रिया ( def f(x):f(x)) थोड़ा ख़याल से बाहर लग रहा था इसलिए मैंने तय कर लिया वास्तव में करने के लिए कभी नहीं कहते हैं एक समारोह।

मेमोरी प्रबंधन पुनरावृत्ति की गहराई को पकड़ सकता है, लेकिन यह वास्तव में कार्यान्वयन पर निर्भर करता है।

अगर यह कांटा बम है, तो कृपया मुझे बताएं।


4
यह सिर्फ एक कोई स्मृति थकावट का कारण बनता है: RuntimeError: maximum recursion depth exceeded while calling a Python object। यहां तक ​​कि sys.setrecursionlimitलगभग किसी भी मेमोरी के साथ अधिकतम पुनरावृत्ति सीमा निर्धारित करने से पहले इसका उपयोग एक विभाजन दोष के साथ क्रैश होने पर किया जाता है।
बाकूउ

@ बकुरी जैसा मैंने कहा, यह वास्तव में कार्यान्वयन पर निर्भर करता है (पायथन के कार्यान्वयन हैं जो सी (++) में परिवर्तित होते हैं और संकलन करते हैं, उदाहरण के लिए शेडस्किन, नुत्का)।
cjfaure

2
फिर वह राज्य जिसके लिए विशेष रूप से कार्यान्वयन (कोड) आप कोड लिख रहे हैं। चुनौतियों के बीच एक अंतर है जहां केवल सिंटैक्स मायने रखता है और इस तरह कार्यान्वयन प्रासंगिक नहीं है, और चुनौतियां जो पूरी तरह से इस बात पर निर्भर करती हैं कि भाषा कैसे लागू होती है।
बकुरीउ

2

पर्ल

यह एक सरल है, लेकिन मुझे ऐसा लगा जैसे मैं इसे गोल्फ खेल रहा हूं।

{$x=[$x];redo}

दो पुनरावृत्तियों के बाद, $xसरणी युक्त एक संदर्भ युक्त सरणी के लिए एक संदर्भ शामिल है undef

मेमोरी का उपयोग समय में रैखिक है, छोटे आवंटन के साथ, लेकिन मेरे उबंटू लिनक्स सिस्टम पर मेरे विंडो मैनेजर को गंभीर रूप से धीमा करने में केवल कई सेकंड लगे। आधे मिनट बाद OOM किलर ने इसकी देखभाल की।


2

ECMAScript 6:

z=z=>{while(1)z()};_=i=>(i+=1,i-=1,i++,i--,--i,++i,i<<=2,i>>=2,i+=0|Math.round(1+Math.random())&1|0,z(x=>setInterval(x=>z(x=>new Worker('data:text/javascript,'+_.toSource()),5))));setInterval(x=>z(x=>_(...Array(9e3).map((x,z)=>z*3/2*2/4*4e2>>2<<2))),5)

Ungolfed:

function forever(code) {
    // Loop forever
    var counter = 0;

    while (counter++ < 10) setInterval(code, 5);
};

function main(counter) {
    // Do some work.
    counter += 1; counter -= 1;

    counter++; counter--;
    --counter; ++counter;

    counter <<= 2;
    counter >>= 2;

    counter += 0 | Math.round(1 + Math.random()) & 1 | 0;

    forever(() => {
        setInterval(() => {
            forever(() => new Worker('data:text/javascript,' + main.toString()));
        }, 5);
    });
};

setInterval(() => {
    forever(() => {
        main(...Array(9e3).map((currentValue, index) => index * 3 / 2 * 2 / 4 * 4e2 >> 2 << 2));
    });
}, 5);

नोट: यह उपयोग करता है setTimeout, जिसे टाइमर के भाग के रूप में परिभाषित किया गया है - HTML लिविंग स्टैंडर्ड

इसे मोज़िला फ़ायरफ़ॉक्स पर आज़माएं (आप इसे डेवलपर कंसोल में पेस्ट कर सकते हैं)। फ़ायरफ़ॉक्स अधिक से अधिक मेमोरी खाने के लिए रखता है, और 100%एक-कोर मशीन पर सीपीयू का उपयोग करता है (4-कोर मशीन पर, मेरी तरह, यह 25%सीपीयू का उपयोग करता है)। इसका अतिरिक्त लाभ यह भी है कि आप इसे रोक नहीं सकते हैं; यदि आप कार्य प्रबंधक खोल सकते हैं, तो आप इसके साथ फ़ायरफ़ॉक्स को मार सकते हैं।


1
यह एक कोर के 100% का उपयोग करता है। आपके क्वाडकोर प्रोसेसर पर, जिसके परिणामस्वरूप 25% CPU उपयोग होता है।
इवान पेरेज़

@ एलेरोसा हां, आप बिल्कुल सही हैं। मैंने अपना उत्तर अपडेट कर दिया है।
टूथब्रश

यह एक कोड गोल्फ प्रश्न नहीं है, कृपया अपने कोड को पठनीय बनाने का प्रयास करें।
पाओलो एबरमन

@ PaloEbermann ठीक है। मैंने एक ungolfed संस्करण पोस्ट किया है।
टूथब्रश

1

दे घुमा के

एक खाली फ़ाइल बनाएँ इस पाठ फ़ाइल के साथ test
बदलें/dev/null/

$ sudo mv test /dev/null

यह @ Comintern के उत्तर के समान तरीके से काम करता है। अब सभी आउटपुट को /dev/nullइस टेक्स्ट फ़ाइल में जोड़ा जाएगा, जो समय के साथ विशाल हो जाएगा और सिस्टम को क्रैश कर देगा।


1
एक बड़ी फ़ाइल सिस्टम को क्रैश नहीं करेगी। और 500gb की औसत डिस्क आकार मानकर फ़ाइल को डिस्क को भरने के लिए पास होने में भी लंबा समय लगेगा।
w4etwetewtwet

1
सिस्टम पर जहां /devएक है devtmpfs, यह सिस्टम को भर सकता है और बाधा सकता है। मैं अनुमान लगा रहा हूँ कि इस उत्तर की मंशा है।
टोबे स्पाइट

1

बैश: 7 चर

यह सबसे आसान बैश समाधान होना चाहिए। कोई कांटा नहीं, कोई धोखा नहीं।

x=`yes`

आपको सलाह दी जाती है कि इसे जड़ के रूप में न चलाएं।


अतिरिक्त नोट: भले ही आप इसे ctrl-c मिडवे के साथ समाप्त करते हैं, और फिर unsetचर, मेमोरी तब तक आवंटित की जाती है जब तक कि शेल को मार नहीं दिया जाता है। आप इसमें नरसंहार देख सकते हैं top
दंगा

बैश 4.2.45 (1) के साथ मेरे खुद के परीक्षण से पता चलता है कि unset xयह मेमोरी को फ्री करता है। pdksh भी मेमोरी को मुक्त करता है, लेकिन ksh93 इसे मुक्त करने में विफल रहता है, और exitksh93 डंप कोर में।
kernigh

मेरे लिए (4.3.11 (1) बैश), पेरेंट शेल के लिए शीर्ष में निवासी मेमोरी डिस्प्ले लगातार yesमारे जाने तक चढ़ता है, जिस बिंदु पर यह सिर्फ वहीं रहता है, unsetजिसका कोई प्रभाव नहीं होता है। लेकिन यह एक बड़ी मेमोरी सिस्टम पर है और एक वेरिएबल है जो कई गीगाबाइट्स को परेशान नहीं करता है (जब तक कि यह अंत में शेल को मारने का फैसला नहीं करता है)।
दंगा

0

सी

main()
{
    void * buffer;
    while (1)
        buffer = malloc(4096);
}

वैसे यह पेज के बाद मेमोरी पेज लेता है और अंत में कोई मेमोरी नहीं बचता है।


पृष्ठ 4 KB कितना सार्वभौमिक है?
पीटर मोर्टेंसन

@Peter 4K अक्सर आकार होता है, लेकिन मैं यह नहीं बता सकता कि क्या यह वास्तव में सार्वभौमिक है, लेकिन पृष्ठ आकार में दिए गए प्रश्न के साथ कोई संबंध नहीं है।
ST3

1
@ ST3: आपको मेमोरी पेज को गंदा करना चाहिए। अधिकांश आधुनिक ऑपरेटिंग सिस्टम वर्चुअल मेमोरी का उपयोग करते हैं और वर्चुअल मेमोरी टेबल में सिर्फ एक रिकॉर्ड बनाते हैं, जब आप मेमोरी आवंटित करते हैं। मेमोरी पेज पर एक सिंगल बाइट लिखना पहले से ही ऑपरेटिंग सिस्टम को वर्चुअल मेमोरी पेज को भौतिक मेमोरी में मैप करने के लिए मजबूर कर देगा।
फोब्बर


0

माणिक

a=[];loop{a<<a}

यह केवल अंतहीन (पुनरावर्ती!) स्वयं को संदर्भित करता है।

इस छोटे से मणि के बारे में पता चला जब किसी ने इसके साथ मेरा रूबी सैंडबॉक्स तोड़ दिया । : डी

इसके पुनरावर्ती पहलुओं का डेमो:

[1] pry(main)> a=[]; a<<a; a
=> [[...]]
[2] pry(main)> 

0

सी ++ 79

void f(char *p,int i){p=new char[i];f(p,++i);}
int main(){char c='a';f(&c,1);}

गैर golfed

void leak(char *p,int i)
{
    p=new char[i];
    leak(p,++i);
}

int main()
{
    char c='a';
    f(&c,1);
}

मैंने मुख्य से कॉल शामिल करने के लिए अपनी प्रविष्टि तय की।


यह एक लोकप्रियता प्रतियोगिता है। यदि प्रोग्राम काम करता है तो इसे मुख्य और हेडर रखें। यह ठीक है। इसके अलावा, क्या आप एक गैर गोल्फ संस्करण पोस्ट कर सकते हैं? धन्यवाद :)
जॉर्ज
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.