Salve a tutti!!

devo fare un progetto didattico che mi richiede di usare un'array di booleani per implementare un BitSet. Non posso usare classi delle api java e la limitazione della memoria è data dalla grandezza dello heap (ho già inserito il parametro -Xmx1200M per ingrandire la memoria).
Inizialmente l'array di booleani ha una grandezza 10 (inizialmente inserisce rimuove numeri piccoli) poi però nel test dato dal prof inserisce i numeri da 2 a 1000000000.
Qui iniziano i problemi perchè ho dovuto implementare una funzione che mi aumenta la dimensione dell'array. Ecco la funzione:

private void aumentaArray(int x) {
int dim;
Runtime R = Runtime.getRuntime();
int memoriaLibera=(int) R.freeMemory();
int memoriamas= (int) R.maxMemory();
int memoriatotale= (int) R.totalMemory();

//questo pezzo serve per determinare la dimensione dell'array di copia per farlo il più grande //possibile per inserire più valori e fare meno copie

if((x*2)<= memoriaLibera){
dim=x*2;
} else if((x<=memoriaLibera-1)){

dim=memoriaLibera-1;
}
else{
if(z>memoriaLibera)
z=1;
dim=x+z;
z=z*2;

}

//In questo caso creo l'array di Completamento perchè creare la copia mi sfora la memoria //quindi devo crearmi un'array per inserire gli ultimi elementi ma deve essere una dimensione //precisa, o meglio più grande

if((memoriaLibera+(dim+insieme.length))>memoriamas ){
open = true;
completamento = new boolean[memoriatotale-(dim+insieme.length)+memoriaLibera];
minCompletamento = 0;
putcompletamento(x);

} else {

//array di copia
boolean[] b = new boolean[dim];
for (int i = 0; i < insieme.length; i++)
b[i] = insieme[i];

insieme = b;
modCount++;
}

}

Questo metodo funziona ma è arrangiatissimo e lento. Il problema che si presenta è che i valori di FreeMemory non sono attendibili e non capisco perchè (non è un problema di cast già controllato). se alloca un nuovo array di dimensione [memoriaLibera+10000] lo alloca tranquillamente perchè???????

Potete aiutarmi a migliorare questo pezzo di codice?
Grazie mille!