Кіріспе
Деаллокация термині. Компьютерлік ғылымда қоқыс – компьютерлік жүйенің (немесе басқа жүйелік ресурстардың) жадының деректері, объектілер немесе басқа аймақтарын қамтиды, олар жүйе немесе оның үстінде іске қосылған бағдарламаның болашақтағы есептеулерінде қолданылмайды. Кез келген компьютерлік жүйенің жады көлемі шектеулі болғандықтан, және көптеген бағдарламалық құралдар қоқыс тудырады, қоқыспен толған жадыны босату және оны қайта пайдалану үшін жады қоймасына немесе жады жинағына қайтару жиі қажет болады.
In computer science, garbage includes data, objects, or other regions of the memory of a computer system (or other system resources), which will not be used in any future computation by the system, or by a program running on it. Because every computer system has a finite amount of memory, and most software produces garbage, it is frequently necessary to deallocate memory that is occupied by garbage and return it to the heap, or memory pool, for reuse.
Жіктеу
Қоқыс әдетте екі түрге бөлінеді: синтаксистік қоқыс, яғни бағдарламаның жад кеңістігінде орналасқан, бірақ бағдарламаның түбірлік жиынтығынан қол жеткізе алмайтын кез келген нысан немесе дерек; және семантикалық қоқыс, яғни бағдарламаның ешқандай кіріс комбинациясы үшін жұмыс істеп тұрған бағдарлама ешқашан қол жеткізе алмайтын кез келген нысан немесе дерек. Қоқыс емес нысандар мен деректер «тірі» деп аталады. Айта келіңкерлікпен, синтаксистік қоқыс – қол жеткізе алмайтын дерек, ал семантикалық қоқыс – қол жеткізілмейтін дерек. Нақтырақ айтқанда, синтаксистік қоқыс – сілтемелік графқа байланысты қол жеткізе алмайтын дерек (оған жол жоқ), оны көптеген алгоритмдер арқылы анықтауға болады, бұл іздеу арқылы қоқыс жинауда талқыланғандай, тек деректерді ғана емес, кодты да талдауды қажет етеді. Семантикалық қоқыс – қол жеткізе алмайтын (сонымен қатар синтаксистік қоқыс) немесе қол жетімді болғанымен, қол жеткізілмейтін дерек; соңғысы кодты талдауды қажет етеді және, әдетте, шешілмейтін мәселе болып табылады. Синтаксистік қоқыс – семантикалық қоқыстың (көбінесе қатаң) кіші жиынтығы, себебі нысан басқа нысанға сілтеме жасауы мүмкін, бірақ оны ешқашан пайдаланбауы да мүмкін.
Әсерлер
Қоқыс үйінді жадыны тұтынады, сондықтан оны жинап алу қажет (жадты аз пайдалану, жадты жылдам бөлуді қамтамасыз ету және үйіндінің фрагментациясын және жадты аз пайдалану арқылы жад жетіспеу қатесін болдырмау үшін). Дегенмен, қоқысты жинау уақытты алады, ал қолмен жасалса, бағдарламалауға қосымша жұмыс керек. Сонымен қатар, қоқыс жинау объектілерді жояды, осылайша финализаторларды шақыруға мүмкіндік береді, нәтижесінде бағдарлама орындалу барысында кез келген сәтте қалаусыз код орындалуы мүмкін. Қоқыс жинаушылардың қателігінен емес, негізінен қолмен жасалған қоқыс жинаудың қателігінен туындаған дұрыс емес қоқыс жинау (қоқыс емес жадты босату) жад қауіпсіздігін бұзуға әкеледі (әдетте қауіпсіздікке қауіп тудырады), себебі қолданыстағы көрсеткіштер дұрыс емес болады. Синтаксистік қоқысты автоматты түрде жинауға болады, ал қоқыс жинаушылар жан-жақты зерттелген және жасалған. Семантикалық қоқысты әдетте автоматты түрде жинау мүмкін емес, сондықтан ол қоқыс жиналатын тілдерде де жад ағуына себеп болады. Семантикалық қоқысты анықтау және жою әдетте үйінді профильдеуші деп аталатын арнайы түзету құралын қолдану арқылы жасалады, ол қандай объектілердің тірі екенін және оларға қалай жетуге болатынын көруге мүмкіндік береді, соның арқасында қате сілтемелерді жоюға болады.
Қоқысты жою
Қоқысты жоюды басқару мәселесі компьютерлік ғылымда жақсы белгілі. Бірнеше тәсіл қолданылады:
Көптеген операциялық жүйелер процесс немесе бағдарлама аяқталғанда пайдаланған жадын және ресурстарын қайтарып алады. Мұндай ортада жұмыс істеуге арналған қарапайым немесе қысқа мерзімді бағдарламалар шығып, операциялық жүйеге қажетті қалпына келтіру шараларын жүргізуге мүмкіндік береді. Қолмен жадты басқару жүйелерінде немесе бағдарламалау тілдерінде бағдарламашы жад енді қажет болмағанда оны босатуды нақтылы түрде ұйымдастыруы керек. C және C++ – бұл модельді қолдайтын екі танымал тіл. Қоқыс жинау әртүрлі алгоритмдерді қолданып, бағдарламаның күйін автоматты түрде талдайды, қоқысты анықтайды және бағдарламашының араласуынсыз оны босатады. Java және Haskell сияқты көптеген қазіргі заманғы бағдарламалау тілдері автоматты қоқыс жинауды қамтамасыз етеді. Дегенмен, бұл жаңалық емес, себебі ол LISP сияқты көне тілдерде де қолданылған. Бағдарламадан қоқысты анықтау және жою үшін типтік теориялық тәсілдерді (мысалы, аймақтық шешімдерді) зерттеу жұмыстары жүргізілуде. Алайда, проблеманың жалпы типтік теориялық шешімі әзірленбеген.