Mondjuk lehet, hogy az a bajom, hogy nem értek a Java-hoz.
Némi rosszindulattal azt mondhatnám, az a bajod, hogy nem értesz a C++-hoz. Például nagyvonalúan úgy csinálsz, mintha a manuális memóriakezelés ingyen volna. Bizony a malloc/free-nek (vagy new/delete) könyvelést kell vezetni a kiadott és a szabad memóriablokkokról, időnként syscallokra kell várakoznia, hogy memóriát kapjon az operációs rendszertől, vagy hogy épp visszaadjon neki. Bizonyos use case-eknél (jellemzően a sok apró objektum allokálása esetén) a GC gyorsabb lehet a kézi memóriakezelésnél (és itt még nem beszélek referencia-számlálásról), pusztán azért, mert kevesebb könyvelést kell vezetni a memóriakezeléshez. A memóriafoglalás pl. leggyorsabb egy stop-and-copy GC-vel (csak egy pointert kell növelni), a takarítás ideje pedig az élő objektumok méretével arányos.
A reference-counting költsége pedig éppen abban áll, hogy minden pointermásolásnál és minden pointer megszüntetésnél írni-olvasni kell a memóriát. Egy GC-s megoldásnál csak a memória lefoglalásáért kell fizetni. Ha nem érzed meggyőzve magadat, végezz méréseket! Itt van pl. egy csokor, amit valaki más végzett.