জাভাস্ক্রিপ্ট আবর্জনা সংগ্রহ কি? আরও ভাল কোড লেখার জন্য কোনও ওয়েব প্রোগ্রামার জাভাস্ক্রিপ্ট আবর্জনা সংগ্রহ সম্পর্কে বুঝতে গুরুত্বপূর্ণ কি?
জাভাস্ক্রিপ্ট আবর্জনা সংগ্রহ কি? আরও ভাল কোড লেখার জন্য কোনও ওয়েব প্রোগ্রামার জাভাস্ক্রিপ্ট আবর্জনা সংগ্রহ সম্পর্কে বুঝতে গুরুত্বপূর্ণ কি?
উত্তর:
এরিক লিপার্ট কিছুক্ষণ আগে এই বিষয়টি সম্পর্কে একটি বিস্তারিত ব্লগ পোস্ট লিখেছিলেন (অতিরিক্তভাবে এটি ভিবিএস স্ক্রিপ্টের সাথে তুলনা করে )। আরও সঠিকভাবে, তিনি জেএসক্রিপ্ট সম্পর্কে লিখেছেন , যা মাইক্রোসফ্টের নিজস্ব ECMAScript প্রয়োগ করেছে, যদিও জাভাস্ক্রিপ্টের সাথে খুব মিল রয়েছে। আমি কল্পনা করব যে আপনি ইন্টারনেট এক্সপ্লোরারের জাভাস্ক্রিপ্ট ইঞ্জিনের জন্য বিস্তৃত আচরণের সমান হতে পারবেন ume অবশ্যই, বাস্তবায়ন ব্রাউজার থেকে ব্রাউজারে পরিবর্তিত হবে, যদিও আমি সন্দেহ করি যে আপনি বেশ কয়েকটি সাধারণ নীতি গ্রহণ করতে পারেন এবং সেগুলি অন্যান্য ব্রাউজারগুলিতে প্রয়োগ করতে পারেন।
এই পৃষ্ঠা থেকে উদ্ধৃত:
জেএসক্রিপ্ট একটি অ-জেনারেশনাল মার্ক-ও-সুইপ আবর্জনা সংগ্রহকারী ব্যবহার করে। এটি এর মতো কাজ করে:
প্রতিটি স্ক্রিন যা "স্কোপে" থাকে তাকে "স্ক্যাভেন্জার" বলা হয়। একটি বেহালার কোনও সংখ্যা, একটি অবজেক্ট, একটি স্ট্রিং, যাই হোক না কেন উল্লেখ করতে পারে। আমরা স্কেভেঞ্জারগুলির একটি তালিকা বজায় রাখি - ভেরিয়েবলগুলি স্কোপ তালিকায় চলে যায় যখন তারা সুযোগের বাইরে চলে যায় এবং স্কোভ তালিকার বাইরে চলে যায় যখন তারা সুযোগের বাইরে চলে যায়।
প্রতিবার এবং পরে আবর্জনা সংগ্রহকারী চলে। প্রথমে এটি প্রতিটি বস্তু, ভেরিয়েবল, স্ট্রিং ইত্যাদির উপর একটি "চিহ্ন" রাখে - জিসি দ্বারা ট্র্যাক করা সমস্ত স্মৃতি। (জেএসক্রিপ্ট অভ্যন্তরীণভাবে পৃথক তথ্য কাঠামো ব্যবহার করে এবং সেই কাঠামোটিতে প্রচুর অতিরিক্ত অব্যবহৃত বিট রয়েছে, তাই আমরা কেবল সেগুলির মধ্যে একটি সেট করে রেখেছি))
দ্বিতীয়ত, এটি স্কেভেঞ্জার্স এবং স্কেভেঞ্জার তথ্যসূত্রগুলির ট্রানজিটিভ বন্ধের চিহ্নটি পরিষ্কার করে। সুতরাং যদি কোনও স্কেভেঞ্জার অবজেক্ট কোনও ননসেকভেঞ্জার অবজেক্টের উল্লেখ করে তবে আমরা ননস্ভেভেনার এবং এটি যে সমস্ত কিছু উল্লেখ করে তাতে বিট সাফ করি। (আমি আমার আগের পোস্টের চেয়ে আলাদাভাবে "ক্লোজার" শব্দটি ব্যবহার করছি))
এই মুহুর্তে আমরা জানি যে এখনও চিহ্নিত করা সমস্ত মেমরি বরাদ্দ করা মেমরি যা কোনও ইন-স্কোপ ভেরিয়েবলের কোনও পথ দিয়ে পৌঁছানো যায় না। এই সমস্ত অবজেক্টকে নিজেরাই ছিন্ন করতে নির্দেশ দেওয়া হয়েছে, যা কোনও বিজ্ঞপ্তি সংক্রান্ত রেফারেন্সকে ধ্বংস করে destro
গার্বেজ কালেকশন প্রধান উদ্দেশ্য প্রোগ্রামার অনুমতি দেওয়া না এটা সবসময় উপকারী অন্তত কিভাবে গার্বেজ কালেকশন কার্যের একটি মোটামুটি একটা ধারণা আছে -, বস্তু তারা তৈরি এবং ব্যবহারের মেমরি ব্যবস্থাপনা সম্পর্কে চিন্তা করতে অবশ্যই কোন কখনও কখনও এড়ানো সে সম্পর্কে যদিও ।
.তিহাসিক দ্রষ্টব্য: উত্তরের পূর্ববর্তী সংশোধনটিতে delete
অপারেটরের একটি ভুল উল্লেখ ছিল । জাভাস্ক্রিপ্টে অপারেটর একটি বস্তু থেকে একটি সম্পত্তি সরিয়ে ফেলা হবে , এবং বিলকুল থেকে ভিন্ন সি / C ++।delete
delete
delete
ভুলভাবে ব্যবহার করে ; উদাহরণস্বরূপ, প্রথম উদাহরণে পরিবর্তে delete foo
, আপনাকে প্রথমে ইভেন্ট শ্রোতাদের মাধ্যমে সরিয়ে ফেলা উচিত window.removeEventListener()
এবং তারপরে foo = null
ভেরিয়েবলটি ওভাররাইট করতে ব্যবহার করা উচিত; আইই তে, delete window.foo
(তবে তা নয় delete foo
) এছাড়াও যদি foo
বিশ্বব্যাপী হয়ে কাজ করত তবে তবুও এটি এফএফ বা অপেরাতে না হত
delete
একটি অ্যানারি অপারেটর (একটি অভিব্যক্তি), বিবৃতি নয় (যেমন delete 0, delete 0, delete 3
:)। এটি একটি বিবৃতি বিবৃতি দ্বারা প্রকাশ করা যখন বিবৃতি মত দেখাচ্ছে।
যখন DOM অবজেক্ট জড়িত থাকে তখন বিজ্ঞপ্তি সংক্রান্ত রেফারেন্স থেকে সাবধান থাকুন:
জাভাস্ক্রিপ্টে মেমরি ফাঁসের নিদর্শন
মনে রাখবেন যে যখন বস্তুর কোনও সক্রিয় উল্লেখ নেই তখনই স্মৃতি পুনরুদ্ধার করা যায়। এটি ক্লোজার এবং ইভেন্ট হ্যান্ডলারগুলির সাথে একটি সাধারণ বিপত্তি, কারণ কিছু জেএস ইঞ্জিনগুলি কোন ভেরিয়েবলগুলি অভ্যন্তরীণ ফাংশনে প্রকৃতপক্ষে উল্লেখ করা হয় তা পরীক্ষা করে না এবং কেবল ঘের কার্যকারিতার সমস্ত স্থানীয় ভেরিয়েবল রাখে।
এখানে একটি সাধারণ উদাহরণ:
function init() {
var bigString = new Array(1000).join('xxx');
var foo = document.getElementById('foo');
foo.onclick = function() {
// this might create a closure over `bigString`,
// even if `bigString` isn't referenced anywhere!
};
}
bigString
ইভেন্টের হ্যান্ডলারটি যতদিন থাকে ততক্ষণ একটি নিষ্পাপ জেএস বাস্তবায়ন সংগ্রহ করতে পারে না । এই সমস্যাটি সমাধান করার বিভিন্ন উপায় রয়েছে, উদাহরণস্বরূপ bigString = null
শেষে সেট করা init()
( delete
স্থানীয় ভেরিয়েবল এবং ফাংশন আর্গুমেন্টের জন্য কাজ করবে না: delete
বস্তুগুলি থেকে বৈশিষ্ট্যগুলি সরিয়ে দেয় এবং ভেরিয়েবল অবজেক্টটি অ্যাক্সেসযোগ্য) - কঠোর মোডে ES5 এমনকি ReferenceError
যদি আপনি চেষ্টা করেন তবে একটি নিক্ষেপ করবে একটি স্থানীয় ভেরিয়েবল মুছতে!)।
আপনি যদি স্মৃতিশক্তি গ্রহণের যত্ন নেন তবে যতটা সম্ভব অপ্রয়োজনীয় বন্ধ হওয়া এড়াতে পরামর্শ দিচ্ছি।
একটি ব্লগ থেকে নেওয়া ভাল উদ্ধৃতি
ডিওএম উপাদানটি "আবর্জনা সংগ্রহ করা", যেমনটি জেএসক্রিপ্ট উপাদান, যার অর্থ আপনি যদি কোনও উপাদানগুলির মধ্যে কোনও বস্তু তৈরি করেন এবং তারপরে সেই বস্তুর ট্র্যাকটি হারিয়ে ফেলেন তবে শেষ পর্যন্ত এটি পরিষ্কার হয়ে যাবে।
উদাহরণ স্বরূপ:
function makeABigObject() {
var bigArray = new Array(20000);
}
আপনি যখন সেই ফাংশনটি কল করেন, জেএসক্রিপ্ট উপাদানটি একটি বস্তু তৈরি করে (বিগআরাই নামক) যা ফাংশনের মধ্যে অ্যাক্সেসযোগ্য। ফাংশনটি ফিরে আসার সাথে সাথে, আপনি বিগআরাইয়ের "ট্র্যাক হারাবেন" কারণ এর সাথে আর উল্লেখ করার উপায় নেই। ঠিক আছে, জেএসক্রিপ্ট উপাদানটি বুঝতে পারে যে আপনি এটির ট্র্যাক হারিয়ে ফেলেছেন, এবং এত বড়আরে পরিষ্কার হয়ে গেছে - এর স্মৃতি পুনরুদ্ধার করা হয়েছে। একই ধরণের জিনিসটি ডিওএম উপাদানটিতে কাজ করে। আপনি যদি বলেন document.createElement('div')
বা অনুরূপ কিছু, তবে DOM উপাদানটি আপনার জন্য একটি অবজেক্ট তৈরি করে। একবার আপনি কোনওভাবে সেই বস্তুর ট্র্যাক হারিয়ে ফেললে, ডিওএম উপাদানটি সম্পর্কিতটিকে পরিষ্কার করে দেবে।
আমার জ্ঞানের সর্বোপরি জাভাস্ক্রিপ্টের অবজেক্টগুলি পর্যায়ক্রমে সংগ্রহ করা আবর্জনা যখন অবজেক্টের কোনও রেফারেন্স নেই remaining এটি এমন কিছু যা স্বয়ংক্রিয়ভাবে ঘটে থাকে, তবে এটি কীভাবে কাজ করে সে সম্পর্কে আরও জানতে চাইলে, সি ++ স্তরে, ওয়েবকিট বা ভি 8 উত্স কোডটি একবার দেখার জন্য এটি বোধগম্য হয়
সাধারণত আপনার এটি সম্পর্কে চিন্তা করার দরকার নেই, তবে, IE 5.5 এর মত পুরানো ব্রাউজারগুলিতে এবং IE 6 এর প্রথম সংস্করণ এবং সম্ভবত বর্তমান সংস্করণগুলিতে ক্লোজারগুলি এমন বিজ্ঞপ্তিযুক্ত রেফারেন্স তৈরি করবে যা চেক না করা হলে মেমরি খেয়ে শেষ হবে। ক্লোজার সম্পর্কে আমি যে বিশেষ ক্ষেত্রে বলতে চাইছি, আপনি যখন কোনও ডোম অবজেক্টের সাথে একটি জাভাস্ক্রিপ্ট রেফারেন্স যুক্ত করেছিলেন, এবং কোনও ডিওএম অবজেক্টে জাভাস্ক্রিপ্ট অবজেক্টকে উল্লিখিত কোনও বস্তুটি তখন যুক্ত হয়েছিল। মূলত এটি কখনই সংগ্রহ করা যায়নি এবং শেষ পর্যন্ত ক্র্যাশ তৈরির জন্য লুপ করা টেস্ট অ্যাপ্লিকেশনগুলিতে ওএসকে অস্থির হয়ে উঠবে। অনুশীলনে এই ফাঁসগুলি সাধারণত ছোট হয় তবে আপনার কোডটি পরিষ্কার রাখতে আপনার DOM অবজেক্টের জাভাস্ক্রিপ্ট রেফারেন্সটি মুছে ফেলা উচিত।
সাধারণত মুছে ফেলা কীওয়ার্ডটি তাত্ক্ষণিকভাবে JSON ডেটার মতো বড় অবজেক্টগুলি ডি-রেফারেন্স হিসাবে ব্যবহার করতে ভাল হয় যা আপনি ফিরে পেয়েছেন এবং এটির সাথে আপনার যা যা করা দরকার, বিশেষত মোবাইল ওয়েব বিকাশে done এর ফলে জিসির পরবর্তী সুইপটি সেই বস্তুকে সরিয়ে দেয় এবং এর স্মৃতি মুক্ত করে।
mark-and-sweep
স্টাইলের অ্যালগোরিদম এটি যত্ন করে ।
আবর্জনা সংগ্রহ (জিসি) হ'ল স্বয়ংক্রিয় মেমরি পরিচালনার একটি ফর্ম যা আর প্রয়োজন হয় না এমন বস্তুগুলি সরিয়ে।
মেমরির সাথে যে কোনও প্রক্রিয়া চুক্তি এই পদক্ষেপগুলি অনুসরণ করে:
1 - আপনার প্রয়োজনীয় মেমরির স্থান বরাদ্দ করুন
2 - কিছু প্রক্রিয়াজাতকরণ
3 - এই স্মৃতি স্থান বিনামূল্যে
কোন দুটি বস্তুর আর প্রয়োজন নেই তা সনাক্ত করতে দুটি প্রধান অ্যালগরিদম ব্যবহৃত হয়।
রেফারেন্স-কাউন্টিং আবর্জনা সংগ্রহ : এই অ্যালগরিদমটি "কোনও বস্তুর আর কোনও প্রয়োজন নেই" এর সংজ্ঞা হ্রাস করে "কোনও বস্তুর কাছে এর সাথে অন্য কোনও বিষয় উল্লেখ করা হয়নি", কোনও রেফারেন্স পয়েন্ট না থাকলে অবজেক্টটি সরিয়ে ফেলবে
মার্ক-অ্যান্ড-সুইপ অ্যালগরিদম : প্রতিটি বস্তুকে মূল উত্সের সাথে সংযুক্ত করুন। কোনও বস্তু রুট বা অন্য বস্তুর সাথে সংযুক্ত হয় না। এই বস্তু সরানো হবে।
বর্তমানে বেশিরভাগ আধুনিক ব্রাউজারগুলি দ্বিতীয় অ্যালগরিদম ব্যবহার করে।
"কম্পিউটার বিজ্ঞানে, আবর্জনা সংগ্রহ (জিসি) হ'ল স্বয়ংক্রিয় মেমরি পরিচালনার একধরণের উপায় The আবর্জনা সংগ্রহকারী, বা কেবল সংগ্রাহক, আবর্জনা পুনরায় দাবি করার চেষ্টা করেন, বা অ্যাপ্লিকেশনটির মাধ্যমে অ্যাক্সেস বা পুনরায় রূপান্তরিত হবে না এমন বস্তুগুলির দ্বারা ব্যবহৃত স্মৃতি।"
সমস্ত জাভাস্ক্রিপ্ট ইঞ্জিনের নিজস্ব জঞ্জাল সংগ্রহকারী রয়েছে এবং তারা পৃথক হতে পারে। বেশিরভাগ সময় আপনাকে তাদের সাথে ডিল করতে হবে না কারণ তারা যা করতে চায় তা করে।
উন্নত কোড রচনা বেশিরভাগ নির্ভর করে আপনি প্রোগ্রামিং নীতি, ভাষা এবং নির্দিষ্ট বাস্তবায়ন জানেন know
জাভাস্ক্রিপ্ট আবর্জনা সংগ্রহ কি?
এটি পরীক্ষা করুন
আরও ভাল কোড লেখার জন্য কোনও ওয়েব প্রোগ্রামার জাভাস্ক্রিপ্ট আবর্জনা সংগ্রহ সম্পর্কে বুঝতে গুরুত্বপূর্ণ কি?
জাভাস্ক্রিপ্টে আপনি মেমরি বরাদ্দ এবং অবনতির বিষয়ে চিন্তা করেন না। পুরো সমস্যাটি জাভাস্ক্রিপ্ট দোভাষীর কাছে দাবি করা হয়েছে। জাভাস্ক্রিপ্টে লিকগুলি এখনও সম্ভব, তবে তারা দোভাষীর বাগ। আপনি যদি এই বিষয়ে আগ্রহী হন তবে আপনি www.memorymanagement.org এ আরও পড়তে পারেন
উইন্ডোজগুলিতে আপনি ড্রিপ.এক্স্সি ব্যবহার করে মেমরি ফাঁস খুঁজে পেতে পারেন বা আপনার ফ্রি মেমো রুটিন কাজ করে কিনা তা পরীক্ষা করতে পারেন।
এটি সত্যিই সহজ, কেবল একটি ওয়েবসাইট ইউআরএল প্রবেশ করুন এবং আপনি ইন্টিগ্রেটেড আইই রেন্ডারারের স্মৃতিশক্তি ব্যয় দেখতে পাবেন। তারপরে রিফ্রেশটি হিট করুন, স্মৃতিশক্তি বাড়লে আপনি ওয়েবপৃষ্ঠায় কোথাও একটি মেমরি ফাঁস পেয়েছেন। তবে এটি দেখতে খুব দরকারী যে আইইয়ের জন্য মেমরি মুক্ত করার জন্য রুটিনগুলি রয়েছে কিনা।
রেফারেন্সের ধরণগুলি বস্তুটিকে নির্দিষ্ট করা ভেরিয়েবলের মধ্যে সরাসরি সংরক্ষণ করে না, সুতরাং এই উদাহরণে অবজেক্ট ভেরিয়েবল আসলে অবজেক্টের উদাহরণটি ধারণ করে না। পরিবর্তে, এটি মেমরির যে অবস্থানটিতে উপস্থিত রয়েছে সেখানে একটি পয়েন্টার (বা রেফারেন্স) ধারণ করে
var object = new Object();
আপনি যদি অন্যটিকে একটি ভেরিয়েবল বরাদ্দ করেন, প্রতিটি ভেরিয়েবল পয়েন্টারটির একটি অনুলিপি পায় এবং উভয়ই মেমরিতে একই বস্তুকে উল্লেখ করে।
var object1 = new Object();
var object2 = object1;
জাভাস্ক্রিপ্ট একটি আবর্জনা-সংগৃহীত ভাষা, সুতরাং আপনি যখন রেফারেন্স টাইপ ব্যবহার করেন তখন মেমরির বরাদ্দ সম্পর্কে সত্যই আপনার চিন্তা করার দরকার নেই। যাইহোক, এটা সেরা ডি-রেফারেন্স বস্তু আপনি আর তাই আবর্জনা সংগ্রাহক যে মেমরি মুক্ত করতে পারে প্রয়োজন যে। এটি করার সর্বোত্তম উপায় হ'ল অবজেক্ট ভেরিয়েবলটি নালায় সেট করা।
var object1 = new Object();
// do something
object1 = null; // dereference
লক্ষ লক্ষ অবজেক্ট ব্যবহার করা খুব বড় অ্যাপ্লিকেশনে বিশেষভাবে অবজেক্টগুলি ডিফারেন্স করা গুরুত্বপূর্ণ।
অবজেক্ট-ওরিয়েন্টেড জাভাস্ক্রিপ্টের নীতিগুলি থেকে - নিচলাস সি জাকাস