एक्टेशनस्क्रिप्ट 3 का उपयोग करके एक बाइटअरे को उतारना


91

मैं ByteArrayActionScript 3 का उपयोग करके मेमोरी से जबरदस्ती कैसे अनलोड कर सकता हूं ?

मैंने निम्नलिखित कोशिश की है:

// First non-working solution
byteArray.length = 0;
byteArray = new ByteArray();

// Second non-working solution
for ( var i:int=0; i < byteArray.length; i++ ) {
    byteArray[i] = null;
}

जवाबों:


35

मुझे नहीं लगता कि आपको चिंता करने की कोई बात है। अगर System.totalMemoryनीचे जाए तो आप आराम कर सकते हैं। यह बहुत अच्छी तरह से ओएस हो सकता है जो नई मुक्त की गई मेमोरी को पुनः प्राप्त नहीं करता है (अगली बार फ्लैश प्लेयर अधिक मेमोरी के लिए पूछेगा) की प्रत्याशा में।

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

जैसा कि मैंने इसे समझा है, आधुनिक ओएस में मेमोरी प्रबंधन प्रत्येक प्रक्रिया को आवंटित मात्रा को देखने के दृष्टिकोण से सहज नहीं है, या यहां तक ​​कि कुल राशि आवंटित की गई है।

जब मैंने 5 मिनट के लिए अपने मैक का उपयोग किया है तो मेरा 3 जीबी रैम का 95% उपयोग किया जाता है, और यह इस तरह से रहेगा, यह कभी भी नीचे नहीं जाता है। जिस तरह से OS मेमोरी को हैंडल करता है।

जब तक इसकी अन्यत्र आवश्यकता नहीं होती है, तब तक जो प्रक्रियाएँ छोड़ दी जाती हैं, उनके पास अभी भी स्मृति सौंपी गई है (यह उन्हें अगली बार जल्दी लॉन्च कर सकता है, उदाहरण के लिए)।


25

(मैं इस बारे में सकारात्मक नहीं हूं, लेकिन ...)

AS3 एक गैर-नियतात्मक कचरा संग्रह का उपयोग करता है, जिसका अर्थ है कि जब भी रनटाइम ऐसा लगता है, तो डेरेफ़र्ड मेमोरी को मुक्त कर दिया जाएगा (आमतौर पर तब तक नहीं जब तक कि चलाने का कोई कारण न हो, क्योंकि यह निष्पादित करने के लिए एक महंगा ऑपरेशन है)। यह एक ही दृष्टिकोण है जो अधिकांश आधुनिक कचरा एकत्र करने वाली भाषाओं (जैसे सी # और जावा के साथ) द्वारा उपयोग किया जाता है।

यह मानते हुए byteArrayकि सरणी के भीतर या उसके द्वारा बताई गई मेमोरी के लिए कोई अन्य संदर्भ नहीं हैं , आपके byteArrayद्वारा घोषित किए गए दायरे से बाहर निकलने के बाद मेमोरी को किसी बिंदु पर मुक्त कर दिया जाएगा।

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

GC को बाध्य करने के लिए, प्रयास करें (हाँ, दो बार):

flash.system.System.gc();
flash.system.System.gc();

आप यहां और पढ़ सकते हैं


20

इस लेख पर एक नज़र डालें

http://www.gskinner.com/blog/archives/2006/06/as3_resource_ma.html

आईएएनए एक्शनस्क्रिप्ट प्रोग्रामर, हालांकि मुझे लग रहा है कि यह है, क्योंकि जब आप चाहते हैं तो कचरा कलेक्टर नहीं चल सकता है।

इसलिए http://www.craftymind.com/2008/04/09/kick-starting-the-garbage-collector-in-actionscript-3-with-air/

तो मैं उनके संग्रह कोड को आज़माने की सलाह दूंगा और यह देखने में मदद करेगा कि क्या यह मदद करता है

private var gcCount:int;
private function startGCCycle():void{
    gcCount = 0;
    addEventListener(Event.ENTER_FRAME, doGC);
}
private function doGC(evt:Event):void{
    flash.system.System.gc();
    if(++gcCount > 1){
        removeEventListener(Event.ENTER_FRAME, doGC);
        setTimeout(lastGC, 40);
    }
}
private function lastGC():void{
    flash.system.System.gc();
}

16

दुर्भाग्य से जब यह फ्लैश / एक्शनस्क्रिप्ट में मेमोरी प्रबंधन की बात आती है, तो एक पूरी बहुत कुछ नहीं है जो आप कर सकते हैं। ActionScript को उपयोग करने के लिए आसान बनाया गया था (इसलिए वे नहीं चाहते थे कि लोगों को स्मृति प्रबंधन के बारे में चिंता करना पड़े)

एक ByteArrayचर बनाने के बजाय, यह एक वैकल्पिक हल है ।

var byteObject:Object = new Object();

byteObject.byteArray = new ByteArray();

...

//Then when you are finished delete the variable from byteObject
delete byteObject.byteArray;

जहां byteArrayएक गतिशील संपत्ति है byteObject, आप इसके लिए आवंटित की गई मेमोरी को मुक्त कर सकते हैं।


16

मेरा मानना ​​है कि आपने अपने प्रश्न का उत्तर दिया है।

System.totalMemoryआपको आवंटित की गई "उपयोग की गई" मेमोरी की कुल राशि देता है, आवंटित नहीं किया गया है। यह सही है कि आपका आवेदन केवल 20 एमबी का उपयोग कर सकता है, लेकिन इसमें 5 एमबी है जो भविष्य के आवंटन के लिए मुफ्त है।

मुझे यकीन नहीं है कि Adobe डॉक्स स्मृति को प्रबंधित करने के तरीके पर प्रकाश डालेंगे या नहीं।


11

इसलिए, यदि मैं MySQL से 20MB कहता हूं, तो टास्क मैनेजर में RAM एप्लिकेशन के लिए लगभग 25MB बढ़ जाती है। फिर जब मैं कनेक्शन बंद करता हूं और बाइटअरे को हटाने की कोशिश करता हूं, तो रैम कभी भी मुक्त नहीं होता है। हालाँकि, अगर मैं System.totalMemory का उपयोग करता हूं, तो फ़्लैश प्लेयर दिखाता है कि मेमोरी रिलीज़ हो रही है, जो कि ऐसा नहीं है।

क्या फ़्लैश प्लेयर जावा की तरह कुछ कर रहा है और हीप स्पेस को स्टोर कर रहा है और ऐप क्विट होने तक इसे रिलीज़ नहीं कर रहा है?

खैर हाँ और नहीं, जैसा कि आपने अनगिनत ब्लॉग पोस्टों से पढ़ा होगा कि AVM2 में GC आशावादी है और अपने रहस्यमय तरीके से काम करेगा। तो यह जावा की तरह एक सा काम करता है और ढेर जगह आरक्षित करने की कोशिश करता है। हालाँकि यदि आप इसे बहुत लंबा करते हैं और अन्य ऑपरेशन करना शुरू करते हैं जो कुछ महत्वपूर्ण मेमोरी का उपभोग कर रहे हैं, तो यह उस पिछले स्थान को मुक्त कर देगा। आप इसे अपने ऐप के शीर्ष पर चल रहे कुछ परीक्षणों के साथ रात भर प्रोफाइलर का उपयोग करके देख सकते हैं।


10

इसलिए, यदि मैं MySQL से 20MB कहता हूं, तो टास्क मैनेजर में RAM एप्लिकेशन के लिए लगभग 25MB बढ़ जाती है। फिर जब मैं कनेक्शन बंद करता हूं और बाइटअरे को हटाने की कोशिश करता हूं, तो रैम कभी भी मुक्त नहीं होता है। हालाँकि, अगर मैं System.totalMemory का उपयोग करता हूं, तो फ़्लैश प्लेयर दिखाता है कि मेमोरी रिलीज़ हो रही है, जो कि ऐसा नहीं है।

खिलाड़ी स्मृति को "जारी" कर रहा है। यदि आप विंडो को छोटा करते हैं और इसे पुनर्स्थापित करते हैं, तो आपको यह देखना चाहिए कि मेमोरियल अब बहुत करीब है। System.totalMemory दिखाता है।

आप FlexBuilder के प्रोफाइलिंग टूल का उपयोग करने में भी रुचि रख सकते हैं जो आपको दिखा सकता है कि क्या आपके पास वास्तव में मेमोरी लीक है।


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.