সার্কুলার রেফারেন্স (Circular Reference)
সার্কুলার রেফারেন্স তখন তৈরি হয় যখন দুটি ভেরিয়েবল একে অপরের রেফারেন্স রাখে, যার ফলে প্রতিটি অবজেক্টের রেফারেন্স কাউন্ট ১ হয়। পিউর গারবেজ কালেক্টেড সিস্টেমে, যদি ভেরিয়েবলগুলোর কোনো বাহ্যিক রেফারেন্স না থাকে, তবে সার্কুলার রেফারেন্স সমস্যা সৃষ্টি করে না। সেক্ষেত্রে ঘোষিত ভেরিয়েবলগুলো গারবেজ কালেক্ট হয়। কিন্তু রেফারেন্স কাউন্টিং সিস্টেমে কোনো অবজেক্ট ডিস্ট্রয় হয় না, কারণ রেফারেন্স কাউন্ট শূন্য হয় না।
হাইব্রিড সিস্টেমে, যেখানে রেফারেন্স কাউন্টিং এবং গারবেজ কালেকশন দুটোই ব্যবহৃত হয়, সার্কুলার রেফারেন্স শনাক্ত করতে সিস্টেম ব্যর্থ হয় বলে মেমোরি লিক হয়।
উদাহরণ
নিচের উদাহরণে জাভাস্ক্রিপ্ট অবজেক্ট এবং DOM অবজেক্টের মধ্যে সার্কুলার রেফারেন্স দেখানো হয়েছে। জাভাস্ক্রিপ্ট অবজেক্টের DOM অবজেক্ট (Div) এর রেফারেন্স আছে এবং DOM অবজেক্ট (Div) "expando" প্রপার্টি মাধ্যমে জাভাস্ক্রিপ্ট অবজেক্ট (obj) এর রেফারেন্স রাখে। যেহেতু দুটি অবজেক্ট একে অপরের রেফারেন্স রাখে, তাই কোথাও ডিস্ট্রয় হয় না, ফলে মেমোরি লিক হয়।
<html> <body> <script> window.onload = function(){ var obj=document.getElementById("DivElement"); document.getElementById("DivElement").expandoProperty=obj; obj.String=new Array(1000).join(new Array(2000); }; </script> </body> </html>
মেমোরি লিক এড়ানোর উপায়
নিচের উদাহরণে প্রাথমিকভাবে দুটি অবজেক্ট সার্কুলার রেফারেন্সে আছে, কিন্তু যখন জাভাস্ক্রিপ্ট অবজেক্টকে null অ্যাসাইন করা হয়, তখন দুটি অবজেক্ট (জাভাস্ক্রিপ্ট এবং DOM) বিভ্রান্ত হয়ে যায় যে তারা কাকে রেফারেন্স করছে — জাভাস্ক্রিপ্ট অবজেক্ট null কিনা অথবা DOM অবজেক্ট, ফলে সার্কুলার রেফারেন্স ভাঙে।
উদাহরণ
<html> <body> <script> window.onload = function(){ var obj=document.getElementById("DivElement"); document.getElementById("DivElement").expandoProperty=obj; obj.String=new Array(1000).join(new Array(2000); obj = null // this breaks circular reference }; </script> </body> </html>