Sunday, 3 March 2019

ක්‍රමලේඛණයේ කැලිකසල බැහැර කිරීම හෙවත් Garbage Collection හදුනා ගනිමු

මෙම ලිපිය බොහෝ විට ජාවා ක්‍රමලේඛය ඇති  Garbage Collection එක ගැන තමා වැඩි පුර කතා කරන්නේ. C/C++ වැනි ක්‍රමලේඛයක් සැලකුවොත් එහිදි Object එක create එක ගැන හා  Object එක විනාශ වන එක ගැන වගබලා ගැනීම ක්‍රමලේඛකයාගේ වගකීමකි. බොහෝ විට ක්‍රමලේඛකරුවන් Object එක විනාශ කීරීමේ කාර්යය අතපසු කරනවා.   මෙම වගකීම පැහැර හැරියොත් යම් තැනකිදී අලුත් Object  හදන විට, ප්‍රමාණවත් මතකය(memory එක) නොලැබීම නිසා OutOfMemoryErrors ලැබිමෙන් මුලු program එකම අසාමන්‍ය ලෙස අවසන් වී යා හැක.


Java වැනි ක්‍රමලේඛවලදී මෙවැනී දිගු කාලයක් භාවිතා නොවන Object ගැන ක්‍රමලේඛකයා වද විය යුතු නැහැ. මෙවැනි Object, Garbage collector විසින් විනාශකරනු ලබයි. මෙම Garbage collector එක Daemon thread සදහා උදාහරණ වේ. Daemon thread කියන්නේ Low priority එකක් තියෙන  නිතරම ක්‍රියාකාරී තත්වයේ පවතින thread විශේෂයකි.

ක්‍රමලේඛයේ පවතින variable data, Object ආදිය ගබඩා වෙන්නේ heap memory එකකය. Garbage collector එකක ප්‍රධාන කාර්යය වන්නේ Unreachable object විනාශ කරමින්  heap memory එක free කර දීමයි.
 Reference variable එකකින් හදපු object තවත් අවස්ථාවක වෙනත් object  හෝ දත්ත පැවරීම නිසා තවදුරටත් එම කලින් හදපු object එක  භවිතා නොකොට වෙන්වෙලා හුදෙකලා මෙවැනි object එකක් Unreachable object ලෙස හදුන්වයි.

උදාහරණය

  1. Integer i=new Integer(10);
  2. i=null;

line 1දී object  එකක් create වී තියෙනවා. එය i කියන variable එකකට ආදේශ කර ඇත. පසුව i ට null වටිනාකම ලබා දී තිබේ. දැන් line 1දී create වුන ඒ object එක අයේ භාවිතයක් ඇති නොවන ලෙස Unreachable object වෙලා තියෙනවා.

 ක්‍රමලේඛයේ Garbage collection එක programmer සිදුනොකළත්, programmer විසින් object එක Garbage collection වලට අවශ්‍ය වන පරදී සකසා ගත යුතුයි.
එසේ සකසන ආකාර 4ක් තිබේ.

  1.  reference variable එක null අකාරයට හැරවීම (Nullifying)
  2. reference variable එකට යළි පැවරීම් සිදු කිරීම
  3. method තුළ නිර්මිත Object 
  4. Island of Isolation 
මෙහි Island of Isolation කියන්නේ Object එකක් හෝ කිහිපයක් වෙනත් Object සමග සම්බන්ධ නොවී එකිනෙකා අතර බැදී තනි group එකක් විදීහට පැවතීම Island of Isolation ලෙස හදුන්වයි. මෙය නමුත් එය program එකේ කිසිම active වූ object එකකට refer නොකරයි.

JVM තුළ ධාවනය වන Garbage collector එක Garbage collection සිදුකරයි. ක්ෂණිකව සිදුවන Garbage collection දෙයක් නොවන නමුත් කිසියම් කාලයකදී සිදුකරයි. මෙම කාලය කුමන කාලයක දැයි තීරණය කළ නොහැක. නමුත් අපට අවැසී තැනකට හෝ වේලාවකට මෙම  Garbage collector එක ඉල්ලිය හැක. 

එසේ ඉල්ලිය හැකි ආකාර දෙකකි.
  1. System.gc() method එක භාවිතයෙන්
  2. Runtime.getRuntime().gc() method එක භාවිතයෙන්

No comments:

Post a Comment