Senrubigo (en komputado)

El Vikipedio, la libera enciklopedio

Senrubigilo estas tekniko en programlingvo por rultempe aŭtomate (dum fona tasko) kolekti kaj redisponigi ne plu uzatan ĉefmemoron.

Programado konsistas interalie el la kreado de multaj datumblokoj, ĉiu kiu rezervas parton en la memoro, kiu iam devas esti liberigata por reuzo.

La programlingvo ĝenerale havas konstruilon kiu kreas novan objekton (Konto k = new Konto();), kaj rezervas memoron. La posta liberigo povas okazi per la eksplicita voko de detruilo, kiel en la programlingvo C++ (delete k; aŭ blokfino) aŭ povas okazi implicite, per kolektado de rubo (makulaturo) en aparta interna tasko, kiel en Java.

La eksplicita liberigo estis longe favorata, kiel plej superiora rilate al memorutiligo kaj rapideco. Tamen ĝi riskas fragmentado de la memoro (en la tuta memoro estiĝadas truoj de libera memoro, tro malgrandaj por reuzi) kaj cima programado (ne liberigante objektojn).

La aŭtomata senrubigilo sekurigis ekzemple ĝavon (Java), sed komence zorgis pri maloftaj, sed tiuokaze rimarkeblaj paŭzoj kiam la tuta memoro estis senrubigata. Per Java SE 6 jam preskaŭ realtempaj postuloj rilate al la senrubigo eblas, kaj jam antaŭ tio ekzistis realtempaj Java rultempmaŝinoj de aliaj partioj.

Ĉi-tempe la rapideco de Java kun senrubigo povas esti pli alta ol C++ kun eksplicita liberigo. La kialo estas ke la memoradministrado en C++ (kreado, forigado) ankaŭ kostas tempo, precipe se oni samtempe volas preventi tro grandan fragmentadon de memoro.

Oni konkludu ke inter ambaŭ la sistemoj de kreado kaj liberigo de memoro ne ekzistas vera gajnanto. La teorie pli bonaj funkciaj lingvoj jam ĉiam aplikis senrubigilon, ĉar la datumoj estas kreitaj kiel rezulto de funkcivokoj, kaj ne ekzistas variabloj kiel adreso de iu memorbloko.