2015-08-05 8 views
5

जब हमारे आवेदन कुछ समय के लिए चलते हैं, उदाहरण के लिए, घंटों तक दौड़ते हैं, एसबीसीएल ढेर थका हुआ अपवाद फेंक देगा।एसबीबी अपवाद कचरा संग्रह के दौरान ढेर थका हुआ

Heap exhausted during garbage collection: 1968 bytes available, 2128 requested. 
Gen StaPg UbSta LaSta LUbSt Boxed Unboxed LB LUB !move Alloc Waste Trig WP GCs Mem-age 
    0:  0  0  0  0  0  0  0  0  0  0  0 5368709 0 0 0.0000 
    1:  0  0  0  0  0  0  0  0  0  0  0 5368709 0 0 0.0000 
    2:  0  0  0  0  0  0  0  0  0  0  0 5368709 0 0 0.0000 
    3: 101912 101913  0  0 19362 20536  0  0  0 162867456 554752 102714709 0 1 1.4405 
    4: 130984 131071  0  0 29240 18868  0  0 25 191196152 5854216 128537781 14785 1 0.6442 
    5: 75511 81013  0  0 16567 17127 92 99 36 132974568 5818392 2000000 16565 0 0.0000 
    6:  0  0  0  0 7949 1232  0  0  0 37605376  0 2000000 7766 0 0.0000 
    Total bytes allocated = 524643552 
    Dynamic-space-size bytes = 536870912 
GC control variables: 
    *GC-INHIBIT* = true 
    *GC-PENDING* = true 
    *STOP-FOR-GC-PENDING* = false 
fatal error encountered in SBCL pid 3281(tid 3067845440): 
Heap exhausted, game over. 

Welcome to LDB, a low-level debugger for the Lisp runtime environment. 
ldb> 

कोई सुझाव?

+3

सुझाव: अपने ढेर को समाप्त न करें। ऐसा लगता है कि आपके पास कुछ स्मृति रिसाव है, i। ई। चीजों को पकड़ रहे हैं ताकि वे एकत्रित कचरा न हो। – Svante

+1

मैं कभी-कभी एक ही समस्या में भाग गया और यह निर्धारक नहीं था इसलिए मैं (अभी तक) एक बग्रेपोर्ट दर्ज करने में असमर्थ था या मेरे हिस्से में त्रुटि नहीं ढूंढ पाया। लेकिन मुझे सामना करने वाला सामान्य पैटर्न यह था कि मैंने अल्पकालिक उपयोग के लिए बहुत सारी स्मृति आवंटित की। चूंकि एसबीसीएल [पीढ़ी के कचरा संग्रह] का उपयोग करता है {http://www.sbcl.org/manual/#History-and- कार्यान्वयन-of- एसबीसीएल} यह उच्च पीढ़ियों की खराब समाशोधन के कारण हो सकता है। इस प्रकार आप अलग-अलग धागे में उच्च मेम उपयोग के साथ शॉर्टलिविंग फ़ंक्शंस को मजबूर करना चाहते हैं क्योंकि इसने मेरे लिए समस्या हल की है क्योंकि थ्रेड मरने के बाद मेम मुक्त हो जाएगा। – Sim

+1

एक और समाधान 'sbcl - गतिशील-स्थान-आकार ' – Sim

उत्तर

1

एसबीसीएल आपको ढेर पर (sb-ext:dynamic-space-size) बाइट्स आवंटित करने की अनुमति नहीं देता है। यहां आपके पास 512 एमबी डिफ़ॉल्ट आकार (536870 9 12 बाइट्स) है और लिस्प प्रोग्राम पहले से ही उस राशि का उपयोग कर रहा था जब उसने एक और आवंटन करने का प्रयास किया था।

आप एसबीसीएल को गतिशील-अंतरिक्ष-आकार 1024 के साथ शुरू करके 1024 एमबी तक उपलब्ध ढेर स्थान की मात्रा को दोगुना कर सकते हैं। हालांकि, कई टिप्पणियों के अनुसार, स्मृति मेमोरी हो सकती है, जहां ऑब्जेक्ट्स को आनुपातिक रूप से संदर्भित किया जाता है वह समय जो सिस्टम चल रहा है, इसलिए यह केवल एक अस्थायी राहत प्रदान करेगा।

(room t) मानक सामान्य लिस्प फ़ंक्शन कॉल इसे डीबग करने में सहायता कर सकता है, अगर आप इसे समय-समय पर कॉल करते हैं। इस http://dwim.hu/darcsweb/darcsweb.cgi?r=HEAD%20hu.dwim.debug;a=headblob;f=/source/path-to-root.lisp#l42 जो आवंटन अधिक प्रकाश डाला सकता है एसबी-वी एम आंतरिक नक्शा में विशद जानकारी देता है, और SBCL एक सांख्यिकीय प्रोफाइलर, http://www.sbcl.org/manual/#Statistical-Profiler कि आवंटन पर भी रिपोर्टिंग का समर्थन करता है की तरह

अधिक उन्नत कोड।

+0

क्या आप एसबीसीएल प्रोफाइलर का उपयोग करने के कामकाजी उदाहरणों को इंगित कर सकते हैं? मुझे लगता है कि इसमें से कोई भी महत्वपूर्ण आउटपुट प्राप्त करने में सक्षम नहीं है। मैं पांचम और सीएलओएस का उपयोग कर रहा हूं और पूछताछ के समान समस्या में भाग लेता हूं। –

संबंधित मुद्दे