Кіріспе
Компьютерлік бағдарлама қажетсіз жадты босатуға қабілетсіз болғанда, компьютерлік ғылымда жад ақаулығы – компьютерлік бағдарлама жадты бөлуді дұрыс басқара алмаған кезде туындайтын ресурс ақаулығының бір түрі. Бұл жағдайда, қажетті болмай қалған жад босатылмайды. Жад ақаулығы, сондай-ақ, объект жадта сақталғанда, бірақ жұмыс істеп тұрған код оған қол жеткізе алмайтын жағдайда (яғни, қол жеткізе алмайтын жад) да пайда болуы мүмкін. Жад ақаулығының белгілері басқа көптеген проблемаларға ұқсас келеді және оны әдетте бағдарламаның бастапқы кодына қол жеткізе алатын бағдарламашы ғана анықтай алады. Байланысты түсінік – «кеңістік ақаулығы», ол бағдарламаның тым көп жадты пайдалануы, бірақ соңында оны босатуы жағдайында болады. Қолданба жұмыс істеп тұрғанда қол жетімді жүйелік жадты толықтай жұмсауы мүмкін болғандықтан, жад ақаулығы бағдарламалық құралдың ескіруіне себеп немесе ықпал ететін фактор болып табылады.
In computer science, a memory leak is a type of resource leak that occurs when a computer program incorrectly manages memory allocations in a way that memory which is no longer needed is not released. A memory leak may also happen when an object is stored in memory but cannot be accessed by the running code (i. e. unreachable memory). A memory leak has symptoms similar to a number of other problems and generally can only be diagnosed by a programmer with access to the program's source code. A related concept is the "space leak", which is when a program consumes excessive memory but does eventually release it. Because they can exhaust available system memory as an application runs, memory leaks are often the cause of or a contributing factor to software aging.
Бағдарламалау мәселелері
Жад шығыны – бағдарламалауда жиі кездесетін қате, әсіресе C және C++ сияқты автоматты қоқыс жинау механизмі жоқ тілдерді қолданғанда. Әдетте, жад шығыны динамикалық түрде бөлінген жадқа қол жеткізу мүмкін болмаған кезде пайда болады. Жад шығынының кең таралғандығы қол жеткізуге болмайтын жадты анықтауға арналған көптеген түзету құралдарын жасауға әкелді. BoundsChecker, Deleaker, Memory Validator, IBM Rational Purify, Valgrind, Parasoft Insure++, Dr. Memory және memwatch – C және C++ бағдарламалары үшін ең танымал жадты түзету құралдары. Кез келген бағдарламалау тіліне құрастырылған мүмкіндік ретінде "консервативті" қоқыс жинау мүмкіндіктерін қосуға болады, және мұны істеуге арналған кітапханалар C және C++ бағдарламалары үшін қолжетімді. Консервативті коллектор көптеген, бірақ барлық емес, қол жеткізуге болмайтын жадты табады және қайта пайдаланады. Жад менеджері қол жеткізуге болмайтын жадты қалпына келтіре алғанымен, әлі де қол жетімді және демек, әлі де пайдалы жадты босата алмайды. Сондықтан, қазіргі заманғы жад менеджерлері бағдарламашыларға жадты әртүрлі деңгейдегі пайдалылығымен семантикалық түрде белгілеуге мүмкіндік беретін әдістерді ұсынады, бұл қол жетімділіктің әртүрлі деңгейлеріне сәйкес келеді. Жад менеджері күшті түрде қол жетімді объектіні босатпайды. Объект күшті сілтеме арқылы тікелей немесе күшті сілтемелер тізбегі арқылы жанама түрде қол жетімді болса, ол күшті түрде қол жетімді болып саналады. (Күшті сілтеме – әлсіз сілтемеден айырмашылығы, объектінің қоқыс жиналуына кедерес жасайтын сілтеме.) Мұны болдырмау үшін, әзірлеуші пайдаланылғаннан кейін сілтемелерді тазалауға жауапты, әдетте сілтемені қажет болмай қалғанда null мәніне орнату арқылы және қажет болған жағдайда, объектіге күшті сілтемелерді сақтайтын барлық оқиға тыңдаушыларын тіркеуден шығару арқылы. Жалпы, автоматты жад басқару әзірлеушілер үшін сенімді және ыңғайлы, өйткені олар босату процедураларын іске асырудың қажеті жоқ, немесе тазалау орындалатын реттілік туралы алаңдаудың қажеті жоқ, сондай-ақ объектіге әлі сілтеме жасалған-жасалмағаны туралы ойланудың қажеті де жоқ. Сілтеме енді қажет емес екенін білу, бағдарламашы үшін объектіге енді сілтеме жасалмайтынын білуден оңай. Дегенмен, автоматты жад басқару өнімділікке қосымша жүктеме сала алады және жад шығынына себеп болатын барлық бағдарламалау қателерін жоймайды.
Әсерлер
Егер бағдарламада жад ағып жатса және оның жадты пайдалануы үнемі артып жатса, әдетте бірден көзге көрінбейді. Кез келген физикалық жүйенің жадының шекті мөлшері болады, және егер жад ағып кетуі тоқтатылмаса (мысалы, ағып жатқан бағдарламаны қайта іске қосу арқылы) ол әрі қарай проблемалар тудыруы мүмкін. Көптеген қазіргі тұтынушылық десктоп операциялық жүйелерінде физикалық түрде RAM микрочиптерінде орналасқан негізгі жад және қатты дискі сияқты қосымша жад болады. Жадты бөлу динамикалық – әрбір процесс қажеттілігіне қарай жадты алады. Белсенді беттер жылдам қол жеткізу үшін негізгі жадқа көшіріледі; ал белсенді емес беттер қажет болған жағдайда қосымша жадқа шығарылады. Бір процесс көп жадты тұтына бастағанда, ол әдетте негізгі жадтың көбірек бөлігін иеленеді, басқа бағдарламаларды қосымша жадқа шығарып, жүйенің жұмысын айтарлықтай баяулатады. Ағып жатқан бағдарлама тоқтатылса да, басқа бағдарламалардың негізгі жадқа қайта оралуына және өнімділіктің қалыпқа келуіне біраз уақыт қажет болуы мүмкін. Егер жүйенің барлық жады таусылса (виртуалды жад болсын немесе тек негізгі жад, мысалы, кіріктірілген жүйеде), жадты бөлуге жасалған кез келген әрекет сәтсіз аяқталады. Бұл әдетте жадты бөлуге тырысқан бағдарламаның өзін-өзі тоқтатуына немесе сегментациялық қатеге түсуіне себеп болады. Кейбір бағдарламалар осы жағдайдан қалыпқа келтіруге арналған (мысалы, бұрыннан сақталған жадқа қайта оралу арқылы). Жадынан шығуды бірінші болып сезген бағдарлама, жадынан шығуға себеп болған бағдарлама болуы мүмкін немесе болмауы мүмкін. Кейбір көп тапсырмалы операциялық жүйелерде жадтан тыс жағдаймен күресу үшін арнайы механизмдер бар, мысалы, процестерді кездейсоқ түрде тоқтату (бұл "күнасыз" процестерге әсер етуі мүмкін) немесе жадтағы ең үлкен процесті тоқтату (демек, мәселені тудыратын осы процесс деп есептеледі). Кейбір операциялық жүйелерде бір бағдарламаның жүйедегі барлық жадты иеленуіне жол бермеу үшін процестер бойынша жад лимиті қарастырылған. Мұндай реттеудің кемшілігі – операциялық жүйені кейде графикалық, бейнелік немесе ғылыми есептеулер сияқты үлкен жад көлемін қажет ететін бағдарламаларды дұрыс жұмыс істеуі үшін қайта конфигурациялау қажет болуы. Егер жад ядросында ақау болса, операциялық жүйенің өзі де істен шығуы мүмкін. Жадты басқарудың жетілдірілген жүйесі жоқ компьютерлер, мысалы кіріктірілген жүйелер, жадтың үнемі ағып кетуінен толыққанды құлап қалуы мүмкін. Веб-серверлер немесе маршрутизаторлар сияқты жалпыға қолжетімді жүйелер шабуылшы ақауды тудыратын операциялардың тізбегін тапса, қызметтен бас тарту шабуылдарына ұшырауы мүмкін. Мұндай тізбек эксплойт деп аталады. Қолданба ішіндегі жад ағып кетуінің белгісі болуы мүмкін, әсіресе тік түсіп кетулер осы қолданбаның қайта жүктелуімен немесе қайта іске қосылуымен сәйкес келсе, жадты пайдаланудың "тісті ара" сияқты үлгісі байқалуы мүмкін. Дегенмен, сақтық тану керек, өйткені қоқыс жинау орындары да осындай үлгіні тудыруы мүмкін және үйіндіні дұрыс пайдалануды көрсетеді.
Басқа жады тұтынушылар
Есте сақтауды үнемі пайдаланудың артуы міндетті түрде жадтың ағуының белгісі емес екенін ескеріңіз. Кейбір қолданбалар жадында (мысалы, кэш ретінде) үнемі көбейіп келе жатқан ақпаратты сақтайды. Егер кэш проблема тудыратын деңгейге жетсе, бұл бағдарламалау немесе жобалау қатесі болуы мүмкін, бірақ ақпарат номиналды түрде қолданыста болғандықтан, бұл жадтың ағуы емес. Басқа жағдайларда бағдарламаларға артық жад қажет болуы мүмкін, себебі бағдарламашы жад белгілі бір міндетті орындау үшін әрқашан жеткілікті деп ойлайды; мысалы, графикалық файлды өңдеуші кескін файлының толық мазмұнын оқып, оны жадқа сақтаудан бастауы мүмкін, бірақ егер кескіннің көлемі қолданыстағы жадтан асып кетсе, мұндай әрекет мүмкін емес. Басқаша айтқанда, жадтың ағуы – бағдарламалау қатесінің бір түрі, сондықтан бағдарлама кодына қол жеткізбей, белгілерін байқаған адам жадтың ағуы болуы мүмкін деген болжам жасауға ғана болады. Ішкі білім болмаған жағдайда, "жадты үнемі пайдаланудың артуы" сияқты терминдерді қолдану дұрыс болар еді.