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

मैं एक्शनस्क्रिप्ट 3 का उपयोग कर स्मृति से ByteArray को मजबूती से कैसे उतार सकता हूं?

मैंने कोशिश की है (सफलता के बिना):

byteArray.length = 0;
byteArray = new ByteArray();

तथा:

for ( var i:int=0; i < byteArray.length; i++ ) {
    byteArray[i] = null;
}
0
जोड़ा संपादित
विचारों: 11

7 उत्तर

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

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

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

Hence 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();
}
0
जोड़ा

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

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

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

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

जीसी को मजबूर करने के लिए, कोशिश करें (हाँ, दो बार):

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

You can read more here.

0
जोड़ा

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

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 की एक गतिशील प्रॉपर्टी है, आप इसके लिए आवंटित स्मृति को मुक्त कर सकते हैं।

0
जोड़ा

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

System.totalMemory gives you the total amount of memory being "used", not allocated. It is accurate that your application may only be using 20mb, but it has 5mb that is free for future allocations.

मुझे यकीन नहीं है कि क्या एडोब दस्तावेज़ इस तरह प्रकाश डाल देंगे कि यह स्मृति का प्रबंधन करता है ...

0
जोड़ा

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

जैसा कि मैंने इसे समझा है, आधुनिक ओएस में मेमोरी प्रबंधन प्रत्येक प्रक्रिया को आवंटित रकम, या यहां तक ​​कि आवंटित कुल राशि को देखने के परिप्रेक्ष्य से अंतर्ज्ञानी नहीं है। जब मैंने अपने मैक का उपयोग 5 मिनट के लिए किया है तो मेरी 3 जीबी रैम का 9 5% उपयोग किया जाता है, और यह इस तरह से रहेगा, यह कभी नीचे नहीं जाता है। ओएस मेमोरी को संभालने का यही तरीका है। जब तक इसकी आवश्यकता नहीं होती है तब तक भी उन प्रक्रियाओं को छोड़ दें जिन्हें अभी भी छोड़ दिया गया है, उन्हें स्मृति सौंपा गया है (यह उन्हें अगली बार लॉन्च कर सकता है, उदाहरण के लिए)।

0
जोड़ा

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

     

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

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

0
जोड़ा