अब मैं इस समस्या के बारे में 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:
मैं अपने समस्या हल हो गई है, मैं अपने संरचना बदल दिया है। असल में मुख्य कार्यक्रम (लंबे समय तक चलने वाला) अलग हो गया है और मैं छोटे प्रोग्राम का उपयोग करता हूं जो सभी धागे से बाहर निकलने से पहले प्रतीक्षा करते हैं।
इस तरह यह वर्चुअल मेमोरी और अन्य डिमन को पूरा नहीं करता है।
मुझे उस समाधान के लिए अग्रणी सभी के लिए धन्यवाद।
मैंने ओएस एक्स 10.8/पर्ल 5.16.0 पर उन्हें आजमाया है। मैं जिस व्यवहार को पहली बार देखता हूं वह लगभग 6 मेग्स निवासी पर कुछ हज़ार धागे के बाद स्मृति उपयोग स्तर बंद होता है। दूसरे स्तर एक ही स्तर पर बंद हो जाते हैं और नींद में रहते हैं। थ्रेड मेमोरी स्पष्ट रूप से दोनों मामलों में जारी की जा रही है। क्या आप और सबूत पोस्ट कर सकते हैं कि स्मृति जारी नहीं की जा रही है? शायद हर दूसरे 'पीएस' आउटपुट? – Schwern
पीएस आउटपुट जोड़ा गया। असल में असली कार्यक्रम अधिक जटिल है, यहां पर फ्लेम नहीं होने के लिए यहां पोस्ट नहीं किया गया है, लेकिन यह लंबे समय तक चलता है और प्रत्येक घंटे लगभग 250 से 900 धागे खुलता है जो मेरी कुल स्मृति के लगभग 10% तक स्मृति को पूरा करता है और कभी भी रिलीज़ नहीं होता । लेकिन यह दूसरे उदाहरण में बिल्कुल सही तरीका है। अगर आपको अधिक जानकारी चाहिए तो मुझे बताएं। धन्यवाद – user1761742
अगर मैं गलत हूं, तो मुझे सही करें, लेकिन * प्रक्रिया * बाहर निकलने पर पर्ल * केवल * मुफ्त मेमोरी नहीं है? यह एक लंबे समय से "फीचर" रहा है, और मुझे हाल ही में perldeltas में थ्रेडिंग के संबंध में अनुकूलन का कोई सबूत नहीं मिला। मैं "रिसाव" की तुलना में आपके द्वारा दावा किए जाने वाले स्मृति उपयोग के * कमी * द्वारा अधिक सुप्रसिद्ध हूं। – amon