Ik ben een search tree aan het implementeren, en zit met het probleem dat java extreem langzaam wordt naarmate de tree groter wordt. Ik vermoed dat dit komt doordat de Garbage Collector steeds meer tijd nodig heeft om het geheugen te checken. Nu is het zo dat ik weet dat het overgrote deel van het geheugen nooit 'out of scope' raakt (de search tree), en dus nooit opgeruimd hoeft te worden. Het is dus zeer inefficiënt dat de GC telkens weer die hele tree afzoekt.
Ik vroeg mij dus af of iemand hier weet hoe je garage collection efficiënter kunt maken. Bijvoorbeeld door het tweaken van parameters, of simpelweg door een andere JVM te gebruiken (op dit moment gebruik ik de standaard JVM die met de development kit van Sun meekomt).
Ik zat bijvoorbeeld te denken aan reference counting. Het nadeel van reference counting is dat dit niet goed werkt wanneer je circular references hebt, maar daar heb ik er niet zoveel van in mijn code, behalve dan in de search tree die sowieso niet opgeruimd moet worden. Het grote voordeel is dat de GC niet constant het hele geheugen hoeft af te zoeken.
Een andere oplossing zou misschien zijn om (in het geval van een generational GC) de GC zodanig af te stellen dat de tree op de old generation terecht komt en dat deze maar zelden gescand wordt.
Nou heb ik dus geen idee welke JVM's gebruik maken van deze technieken, of hoe je hun parameters kunt tweaken. Is hier misschien iemand die daar meer verstand van heeft?
Ik gebruik OS X Lion en gebruik Eclipse om te programmeren. Verder is het programma bedoeld voor wetenschappelijke doeleinden, dat wil zeggen dat het niet op andere machines hoeft te draaien dan de mijne, zolang ik er maar experimenten mee kan doen.