অ্যাকশনসক্রিপ 3 ব্যবহার করে বাইটআররে আনলোড


91

আমি কীভাবে ByteArrayঅ্যাকশনস্ক্রিপ্ট 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যায় নিচে আপনি শিথিল করতে পারেন। এটি খুব ভাল ওএস হতে পারে যা সদ্য মুক্তিপ্রাপ্ত মেমরিটিকে পুনরায় দাবি জানায় না (পরের বারের প্রত্যাশায় ফ্ল্যাশ প্লেয়ার আরও মেমরি চাইবে)।

খুব স্মৃতিশক্তি সহকারে এমন আরও কিছু করার চেষ্টা করুন এবং আমি নিশ্চিত যে আপনি খেয়াল করবেন যে ফ্ল্যাশ প্লেয়ারকে বরাদ্দ করা মেমরিটি হ্রাস পাবে এবং পরিবর্তে অন্য প্রক্রিয়ার জন্য ব্যবহার করা হবে।

যেমনটি আমি এটি বুঝতে পেরেছি, আধুনিক ওএসের মেমরি পরিচালনা প্রতিটি প্রক্রিয়াতে বরাদ্দকৃত পরিমাণগুলি, এমনকি বরাদ্দকৃত মোট পরিমাণের দিকে তাকানোর দৃষ্টিকোণ থেকে স্বজ্ঞাত নয়।

আমি যখন 3 মিনিটের জন্য আমার 3 জিবি র‌্যামের 95% ব্যবহার করে ম্যাক ব্যবহার করি এবং এটি সেভাবেই থাকবে, এটি কখনই নামবে না। ওএস মেমরি পরিচালনা করার উপায়টি।

যতক্ষণ না এটি অন্য কোথাও প্রয়োজন হয় না এমনকি এমনকি যে প্রক্রিয়াগুলি ছেড়ে গেছে তাদের এখনও মেমরি বরাদ্দ করা হয় (এটি তাদের পরবর্তী সময়ের জন্য আরও দ্রুত চালু করতে পারে, উদাহরণস্বরূপ)।


25

(আমি এ বিষয়ে ইতিবাচক নই, তবে ...)

এএস 3 একটি অ-নিষ্ক্রিয় আবর্জনা সংগ্রহ ব্যবহার করে যার অর্থ রানারটাইম যখনই মনে করে (তখন এটি চালানোর কোনও কারণ না থাকলে সাধারণত তা নয়) এটি কার্যকর করার জন্য ব্যয়বহুল অপারেশন রয়েছে means এটি বেশিরভাগ আধুনিক আবর্জনা সংগ্রহকারী ভাষা (যেমন সি # এবং জাভা) ব্যবহার করে যা একই পদ্ধতি।

ধরে নেওয়া মেমরির সাথে byteArrayবা অ্যারের মধ্যে থাকা আইটেমগুলির মধ্যে অন্য কোনও উল্লেখ নেই , আপনি যেখানে byteArrayঘোষিত হওয়ার সুযোগটি বাইরে বেরোনোর ​​পরে মেমরিটি কোনও একসময় মুক্ত হবে ।

আপনি জঞ্জাল সংগ্রহ করতে বাধ্য করতে পারেন, যদিও আপনার সত্যিকারের উচিত নয় should আপনি যদি করেন তবে এটি পরীক্ষার জন্যই করুন। আপনি যদি উত্পাদনে এটি করেন তবে আপনি কার্যকারিতাটিকে সহায়তা করার চেয়ে অনেক বেশি ক্ষতিগ্রস্থ করবেন।

একটি জিসি জোর করতে, চেষ্টা করুন (হ্যাঁ, দুবার):

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-tivescript-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

দুর্ভাগ্যক্রমে যখন ফ্ল্যাশ / ক্রিয়াকলাপে মেমরি পরিচালনার বিষয়টি আসে তখন আপনি করতে পারেন এমন পুরোটা নেই। অ্যাকশনস্ক্রিপ্টটি সহজে ব্যবহারের জন্য ডিজাইন করা হয়েছিল (যাতে তারা চায় না যে লোকেরা স্মৃতি পরিচালনার বিষয়ে উদ্বিগ্ন হয়)

নীচে একটি 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বরাদ্দ নয়, আপনাকে "ব্যবহৃত" হওয়ার মোট পরিমাণ দেয় memory এটি সঠিক যে আপনার অ্যাপ্লিকেশনটি কেবলমাত্র 20 এমবি ব্যবহার করছে, তবে এতে 5 এমবি রয়েছে যা ভবিষ্যতের বরাদ্দের জন্য বিনামূল্যে।

আমি নিশ্চিত নই যে অ্যাডোব ডক্স এটি মেমরি পরিচালনা করে এমনভাবে আলোকপাত করবে।


11

সুতরাং, যদি আমি মাইএসকিউএল থেকে 20 এমবি লোড করি, টাস্ক ম্যানেজারে অ্যাপ্লিকেশনটির র‌্যাম প্রায় 25 এমবি দ্বারা প্রবাহিত হয়। তারপরে যখন আমি সংযোগটি বন্ধ করি এবং বাইটআরয়িকে নিষ্পত্তি করার চেষ্টা করি তখন র‌্যাম কখনই মুক্ত হয় না। তবে আমি যদি সিস্টেম.টোটাল মেমোরি ব্যবহার করি তবে ফ্ল্যাশ প্লেয়ারটি দেখায় যে মেমরিটি মুক্তি পাচ্ছে, যা এরকম নয়।

ফ্ল্যাশ প্লেয়ার জাভা এর মতো কিছু করছে এবং হ্যাপের জায়গা সংরক্ষণ করছে এবং অ্যাপটি ছাড়ার আগ পর্যন্ত এটিকে ছেড়ে দিচ্ছে না?

হ্যাঁ এবং না, যেমন আপনি অগণিত ব্লগ পোস্টগুলি থেকে পড়ে থাকতে পারেন যে এভিএম 2-তে জিসি আশাবাদী এবং এটি নিজের রহস্যজনক উপায়ে কাজ করবে। সুতরাং এটি জাভা এর মতো কিছুটা কাজ করে এবং গাদা স্থান সংরক্ষণ করার চেষ্টা করে। তবে আপনি যদি এটি দীর্ঘায়িত হতে দেন এবং অন্যান্য ক্রিয়াকলাপগুলি শুরু করেন যা কিছু উল্লেখযোগ্য স্মৃতি গ্রহণ করছে, এটি আগের স্থানটি মুক্ত করবে। আপনার অ্যাপ্লিকেশনের শীর্ষে কিছু পরীক্ষা চলতে আপনি রাতারাতি প্রোফাইলার ব্যবহার করে এটি দেখতে পারেন।


10

সুতরাং, যদি আমি মাইএসকিউএল থেকে 20 এমবি লোড করি, টাস্ক ম্যানেজারে অ্যাপ্লিকেশনটির র‌্যাম প্রায় 25 এমবি দ্বারা প্রবাহিত হয়। তারপরে যখন আমি সংযোগটি বন্ধ করি এবং বাইটআরয়িকে নিষ্পত্তি করার চেষ্টা করি তখন র‌্যাম কখনই মুক্ত হয় না। তবে আমি যদি সিস্টেম.টোটাল মেমোরি ব্যবহার করি তবে ফ্ল্যাশ প্লেয়ারটি দেখায় যে মেমরিটি মুক্তি পাচ্ছে, যা এরকম নয়।

প্লেয়ারটি স্মৃতিটিকে "মুক্তি দিচ্ছে"। আপনি যদি উইন্ডোটি ন্যূনতম করেন এবং এটি পুনরুদ্ধার করেন তবে আপনাকে দেখতে হবে যে মেমোরিটি এখন সিস্টেম.টোটালমেমিটি যা দেখায় তার থেকে অনেক কাছে।

আপনি ফ্লেক্সবিল্ডারের প্রোফাইলিং সরঞ্জামগুলি ব্যবহার করতে আগ্রহী হতে পারেন যা আপনার কাছে সত্যই মেমরি ফুটো আছে কিনা তা আপনাকে দেখাতে পারে।


আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.