मैं डेल्फी 200 का उपयोग कर रहा हूं जिसमें फास्टएमएम 4 मेमोरी मैनेजर है।मेरा डेल्फी प्रोग्राम की स्मृति क्यों बढ़ती जा रही है?
मेरा प्रोग्राम एक बड़े डेटासेट को पढ़ता है और संसाधित करता है। जब भी मैं डेटासेट साफ़ करता हूं या प्रोग्राम से बाहर निकलता हूं तो सभी मेमोरी सही ढंग से मुक्त हो जाती है। इसमें कोई स्मृति रिसाव नहीं है।
स्पैनवार के उत्तर में दिए गए CurrentMemoryUsage दिनचर्या का उपयोग करना: How to get the Memory Used by a Delphi Program, मैंने प्रसंस्करण के दौरान FastMM4 द्वारा उपयोग की गई स्मृति प्रदर्शित की है।
ऐसा लगता है कि प्रत्येक प्रक्रिया और रिलीज चक्र के बाद स्मृति का उपयोग बढ़ रहा है। उदाहरण:
1,456 KB कोई प्रोग्रामसेट के साथ अपना प्रोग्राम शुरू करने के बाद उपयोग किया जाता है।
218,455 KB एक बड़ा डेटासेट लोड करने के बाद उपयोग किया जाता है।
71,994 KB डेटासेट को पूरी तरह साफ़ करने के बाद। अगर मैं इस बिंदु से बाहर निकलता हूं (या मेरे उदाहरण में कोई भी बिंदु), तो कोई मेमोरी लीक की सूचना नहीं दी जाती है।
271,905 KB उसी डेटासेट को फिर से लोड करने के बाद उपयोग किया जाता है।
125,443 KB डेटासेट को पूरी तरह साफ़ करने के बाद।
325,519 KB उसी डेटासेट को फिर से लोड करने के बाद उपयोग किया जाता है।
179,059 KB डेटासेट को पूरी तरह साफ़ करने के बाद।
378,752 KB उसी डेटासेट को फिर से लोड करने के बाद उपयोग किया जाता है।
ऐसा लगता है कि प्रत्येक लोड/स्पष्ट चक्र पर मेरे प्रोग्राम की मेमोरी उपयोग लगभग 53,400 केबी बढ़ रही है। कार्य प्रबंधक पुष्टि करता है कि यह वास्तव में हो रहा है।
मैंने सुना है कि फास्टएमएम 4 ऑब्जेक्ट्स मुक्त होने पर ऑपरेटिंग सिस्टम पर सभी प्रोग्राम की याददाश्त को हमेशा जारी नहीं करता है ताकि जब इसे और अधिक चाहिए तो यह कुछ स्मृति को बनाए रख सके। लेकिन यह लगातार बढ़ रहा है मुझे परेशान करता है। चूंकि कोई स्मृति रिसाव की सूचना नहीं दी जाती है, इसलिए मैं किसी समस्या की पहचान नहीं कर सकता।
क्या कोई जानता है कि यह क्यों हो रहा है, यदि यह बुरा है, और यदि कुछ भी है तो मैं इसके बारे में क्या कर सकता हूं या कर सकता हूं?
धन्यवाद आपके जवाब के लिए dthorpe और मेसन। तुमने मुझे उन चीजों को सोचने और कोशिश करने की कोशिश की जो मुझे एहसास हुआ कि मुझे कुछ याद आ रहा था। तो विस्तृत डिबगिंग की आवश्यकता थी।
जैसा कि यह पता चला है, मेरे सभी ढांचे को बाहर निकलने पर ठीक से मुक्त किया जा रहा था। लेकिन रन के दौरान प्रत्येक चक्र के बाद स्मृति रिलीज नहीं था। यह मेमोरी ब्लॉक जमा कर रहा था जो आमतौर पर एक रिसाव का कारण बनता था जो बाहर निकलने पर पता लगाने योग्य होता अगर मेरा निकास सफाई सही नहीं था - लेकिन यह था।
कुछ स्ट्रिंगलिस्ट और अन्य संरचनाएं थीं जिन्हें मुझे चक्रों के बीच साफ़ करने की आवश्यकता थी। मुझे अभी भी यकीन नहीं है कि मेरे कार्यक्रम ने पहले के चक्रों से अतिरिक्त डेटा के साथ सही तरीके से कैसे काम किया था, लेकिन ऐसा हुआ। मैं शायद आगे की खोज करूंगा।
इस प्रश्न का उत्तर दिया गया है। आपकी सहायता के लिए धन्यवाद.
IMHO, आप अपने जवाब जोड़ा गया है और बजाय सवाल संपादन के इसे स्वीकार कर लिया जाना चाहिए था। प्रश्न, उत्तर और अपने अनुभव से सीखने के लिए किसी की देखभाल करना आसान है। – EMBarbosa