2012-10-20 7 views
8

अब मैं इस समस्या के बारे में 2 सप्ताह खोज रहा हूं और ऐसा लगता है कि मुझे वेब पर सिर्फ कोई जवाब नहीं मिल रहा है।थ्रेड में पर्ल मेमोरी लीक (थ्रेड मेमोरी रिलीज नहीं करते हैं)

1:

#! /usr/bin/perl 

# 
# RELEASE MEMORY 
# 

use threads; 

my @child; 

$ii=0; 


while (1) 
{ 
    my @child = threads->new(\&test, "test"); 
    $_->detach for @child; 
    print "$ii\n"; 
    $ii++; 
} 

sub test { 
    my ($ee) = 0;  
} 

2:

#! /usr/bin/perl 

# 
# DO NOT RELEASE MEMORY 
# 

use threads; 

my @child; 

$ii=0; 


for($ii=0;$ii<2000;$ii++) { 
    my @child = threads->new(\&test, "test"); 
    $_->detach for @child; 
    print "$ii\n"; 
} 

while(1) 
{ 
    sleep(10); 
} 

sub test { 
    my ($ee) = 0;  
} 

तो यहाँ समस्या है

तो, यहाँ कोड के दो टुकड़ा है। पहला कोड केवल एक अनंत लूप चलाता है और यह प्रत्येक 2 सेकंड (पीएस के अनुसार) ऑपरेटिंग सिस्टम पर वापस स्मृति जारी करता है

दूसरा कोड स्मृति भी जारी कर रहा है, लेकिन केवल जब वह "फॉर" लूप के अंदर चल रहा है। एक बार जब यह लूप के लिए बाहर निकलता है और अनंत लूप दर्ज करता है तो सभी मेमोरी जिन्हें लूप में मुक्त नहीं किया जाता है, कभी भी ऑपरेटिंग सिस्टम पर वापस नहीं छोड़ा जाता है।

क्या कोई भी एक ही समस्या का सामना कर रहा है?

पर्ल: (v5.16.1) x86_64-linux-धागे की बहु के लिए बनाया गया

ओएस: डेबियन 6.0.5

धन्यवाद एक बहुत


संपादित करें 1: मैं इस्तेमाल किया 800 धागे और सभी सत्यापित हैं कि वे $ e var प्रिंट करके बाहर निकलें।

लेकिन एक बार (1) लूप में प्रवेश करने के बाद यहां ps aux | grep perl आउटपुट:

[email protected]:~# ps aux | grep perl 
root  6807 41.5 2.5 387780 209580 pts/0 S+ 16:38 0:02 /opt/ActivePerl-5.16/bin/perl /home/tttlast.pl 
root  7627 0.0 0.0 7548 856 pts/1 S+ 16:38 0:00 grep perl 

तो सभी थ्रेड निकल गए लेकिन स्मृति उपयोग अभी भी मेरे सर्वर की कुल स्मृति का 2.5% है। तो जब तक कि मैं प्रोग्राम को मार नहीं देता तब तक स्मृति अभी भी उपयोग में है।


संपादित करें 2:

मैं अपने समस्या हल हो गई है, मैं अपने संरचना बदल दिया है। असल में मुख्य कार्यक्रम (लंबे समय तक चलने वाला) अलग हो गया है और मैं छोटे प्रोग्राम का उपयोग करता हूं जो सभी धागे से बाहर निकलने से पहले प्रतीक्षा करते हैं।

इस तरह यह वर्चुअल मेमोरी और अन्य डिमन को पूरा नहीं करता है।

मुझे उस समाधान के लिए अग्रणी सभी के लिए धन्यवाद।

+3

मैंने ओएस एक्स 10.8/पर्ल 5.16.0 पर उन्हें आजमाया है। मैं जिस व्यवहार को पहली बार देखता हूं वह लगभग 6 मेग्स निवासी पर कुछ हज़ार धागे के बाद स्मृति उपयोग स्तर बंद होता है। दूसरे स्तर एक ही स्तर पर बंद हो जाते हैं और नींद में रहते हैं। थ्रेड मेमोरी स्पष्ट रूप से दोनों मामलों में जारी की जा रही है। क्या आप और सबूत पोस्ट कर सकते हैं कि स्मृति जारी नहीं की जा रही है? शायद हर दूसरे 'पीएस' आउटपुट? – Schwern

+0

पीएस आउटपुट जोड़ा गया। असल में असली कार्यक्रम अधिक जटिल है, यहां पर फ्लेम नहीं होने के लिए यहां पोस्ट नहीं किया गया है, लेकिन यह लंबे समय तक चलता है और प्रत्येक घंटे लगभग 250 से 900 धागे खुलता है जो मेरी कुल स्मृति के लगभग 10% तक स्मृति को पूरा करता है और कभी भी रिलीज़ नहीं होता । लेकिन यह दूसरे उदाहरण में बिल्कुल सही तरीका है। अगर आपको अधिक जानकारी चाहिए तो मुझे बताएं। धन्यवाद – user1761742

+1

अगर मैं गलत हूं, तो मुझे सही करें, लेकिन * प्रक्रिया * बाहर निकलने पर पर्ल * केवल * मुफ्त मेमोरी नहीं है? यह एक लंबे समय से "फीचर" रहा है, और मुझे हाल ही में perldeltas में थ्रेडिंग के संबंध में अनुकूलन का कोई सबूत नहीं मिला। मैं "रिसाव" की तुलना में आपके द्वारा दावा किए जाने वाले स्मृति उपयोग के * कमी * द्वारा अधिक सुप्रसिद्ध हूं। – amon

उत्तर

4

यहां कोई "समस्या" नहीं है। यह सब सामान्य, अपेक्षित व्यवहार है। यदि यह आपको किसी प्रकार की समस्या का कारण बन रहा है, तो आपने यह समझाया नहीं है कि यह क्या है।

वर्चुअल मेमोरी को ऑपरेटिंग सिस्टम में वापस करने का कोई कारण नहीं है क्योंकि वर्चुअल मेमोरी एक दुर्लभ संसाधन नहीं है। ऑपरेटिंग सिस्टम में भौतिक मेमोरी वापस करने का कोई कारण नहीं है क्योंकि ऑपरेटिंग सिस्टम इसे ले जाएगा यदि इसके लिए इसका बेहतर उपयोग होता है।

कोई सबूत नहीं है कि यह एक स्मृति रिसाव है। परीक्षण के नतीजे बताते हैं कि ऐसा कोई मामला नहीं है जहां मेमोरी उपयोग बाध्य किए बिना बढ़ता है - सभी मामलों में यह अंततः समाप्त होता है।

+0

बस सत्यापित है और आप सही हैं। अन्य प्रक्रियाओं द्वारा उपयोग की जाने वाली स्मृति तब ली जाती है जब पर्ल प्रोग्राम को स्मृति की आवश्यकता होती है। वास्तव में मुद्दा यह है कि पर्ल से अन्य प्रक्रिया मेमोरी और मेल सर्वर की तरह मेमोरी ले जाती है। और यह कि पीएलएल प्रोग्राम चलाने के लिए mysql और मेल सर्वर का उपयोग करता है। क्या मुझे अपनी पोस्ट संपादित करनी चाहिए या कोई अन्य प्रश्न पोस्ट करना चाहिए? बीटीडब्ल्यू बहुत धन्यवाद – user1761742

+1

आपको बस इतना सारे धागे नहीं बनाना चाहिए। यह समझदार नहीं है। –

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