Forðist ruslasöfnun!

Ruslasöfnun (garbage collection) er það kallað þegar notuðum hlutum er hent svo þeir safnist ekki fyrir í minni tölvunnar. Þetta er sjálfvirkt í java, en það þýðir ekki að ruslinu sé ekki hent eða að það kosti vélina ekki vinnu, því þurfa allir forritarar að hafa hugann við það að halda í lágmarki fjölda þeirra hluta sem búnir eru til og endurnýta það sem hægt er.

Í Java er hlut (Object) hent við lok hverrar blokkar sem aðgang hefur í hlutinn. Söfnunin er verk með lágan forgang þ.a. ruslinu er einungis hent þegar örgjörvinn hefur tíma til þess eða þegar java sýndarvélina (java virtual machine) er farið að vanta minni. Ef sýndarvélina vantar minni mun ruslasöfnunin vinna stöðugt þar til nóg minni hefur losnað, og notar á meðan 5-15% af afli örgjörvans.

Til eru tvær leiðir til að minnka ruslasöfnun:

1. Liggur í augum uppi, skrifa kóða sem endurnotar þá hluti sem eru búnir til. Þannig minnkar vinnan við að búa til og eyða hlutum og aukavinna vélarinnar vonandi hverfur.

Hér má benda á það að búa hlutina til fyrir utan lykkjur, EKKI INNÍ ÞEIM!

Dæmi 1: Léleg forritun – Hér eru búin til hundrað þúsund strengjabreytur og þeim hent aftur jafn óðum.

for(int i=99999; i>0; i–){
String str = “massi”;
System.out.println(str);
}

Dæmi 2: Góð forritun – Hér er sama verkefni leyst með því að búa til eina breytu.

String str = “”;
for(int i=99999; i>0; i–){
str = “massi”;
System.out.println(str);
}

ATH! Þarfnast smá vinnu við upphafsstillingar á breytum við endurnýtingu.

2. Annað ráð er að nota þá hluti sem henta best hverju verkefni, og til skýringar er lítið dæmi úr Java.

Vinna með strengi er nokkuð dýr í Java því strengjum er í raun ekki hægt að breyta, heldur er í hvert skipti sem þú skeytir saman strengjum búnir til ný eintök og ruslasöfnunar er þörf. Þess vegna er oft betra að nota StringBuffer sem þarf ekki að búa til nýja hluti þegar bætt er við textann.

Dæmi 1: Léleg forritun – 9 klippingar = 9 strengi sem þarf að búa til og henda.

System.out.println(massi.getName() + “ á heima að “ + massi.getAddress() + “,“ + massi.getPonr() + “ “ + massi.getStadur() + “, “ + massi.getLand() +”.”);

Dæmi 2: Góð forritun – Einn StringBuffer getur gert sama hlut, minni ruslasöfnun.

StringBuffer buffer = new StringBuffer;
buffer.append(massi.getName());
buffer. append(“ á heima að “);
buffer.append(massi.getAddress());
buffer.append( “, “);
buffer.append(massi.getPonr());
buffer.append(“ “);
buffer.append(massi.getStadur);
buffer.append(“, “);
buffer.append(massi.getLand());
buffer.append(“.” );

Góðar stundir

massi