Gyakorlati alapok III.
A részlegesen destruktív magatartás: a virtuális szemétgyűjtés
Amint az emberiség óriási szeméttermelő organizmus...
...éppúgy a rosszul megírt Java-kód is tekintélyes mennyiségű virtuális szemétgyártásra képes.
A kódfuttatás első pillanataitól kezdve ugyanis objektumok sokasága jön létre, amelyek mindegyike foglalja a műveleti memóriát.
Sok objektumra folyamatosan van szükségünk, de közülük jónéhány alapjában véve csak átmeneti életű. Amikor egy objektum felé már nincs sehonnan hivatkozás (A referencia típusú változó és Ezt sajnos most kell tisztáznunk: mutató és referencia című fejezetek), azaz hétköznapiasan fogalmazva "senki és semmi sem mutat rá", akkor az objektum a rendszer számára garantáltan láthatatlanná, vele elérhetetlenné válik éppúgy, amint egy személy közvetlen elérése is elvész, ha törlik összes elérhetőségét (cím, telefonszám, stb). A Java-rendszer (JVM) azonban figyeli az ilyen objektumokat és néha automatikusan törli, kisöpri őket a műveleti memóriából. A feladatot a garbage collector nevű JVM-rendszerrutin hajtja végre.
Mit érünk el ezzel? A válasz egyértelmű: mivel a műveleti memória nem szemetelődik tele, azaz benne mindig és kizárólag a működéshez szükséges objektumok lesznek, az nem is fog soha megtelni -legalábbis nem a Java működése miatt-, ez tehát elméletileg egy végtelen kapacitású műveleti memóriát jelent.
Itt jegyezzük meg, hogy míg a Javában a szemétsöprés automatikusan történik, például a C és C++ nyelvekben ezt manuálisan kell megtennünk a malloc() és a free() metódusokkal. Ez bizony sokszor okoz gondot bonyolultabb programok esetén.
A szemétsöprés rutinjára közvetlenül is hivatkozhatunk a System.gc() vagy Runtime.gc() metódushívásokkal. Ez azonban (a legjobb tudomásom szerint) pusztán egy kérés, "ajánlás" a rendszer felé, ezért a tisztítási folyamat nem fog beindulni azonnal; a virtuális kukásautó érkezésének tényleges időpontjáról a JVM fog dönteni. Valószínűnek tartom, hogy a rendszer folyamatosan figyeli a terhelhetőséget, a memóriahasználat mértékét, stb., azaz minden olyan tényezőt, amely hatással lehet a futási teljesítményre és a szemétgyűjtést üresjárati időben vagy ehhez hasonló állapotokban indítja be.