/** * It is synchronized as it does merging of adjacent blocks. An easiest way to somewhat address * fragmentation problem. * * @param pointer2free */ private void freeAndMerge(Pointer pointer2free) { synchronized (pointers) { pointers.remove(pointer2free); // merge adjacent blocks if (null != pointer2free.getPrev() && pointer2free.getPrev().isFree()) { // Merge previous pointers.remove(pointer2free.getPrev()); pointer2free.setStart(pointer2free.getPrev().getStart()); pointer2free.setPrev(pointer2free.getPrev().getPrev()); // Recursive call freeAndMerge(pointer2free); } if (null != pointer2free.getNext() && pointer2free.getNext().isFree()) { // Merge Next pointers.remove(pointer2free.getNext()); pointer2free.setEnd(pointer2free.getNext().getEnd()); pointer2free.setNext(pointer2free.getNext().getNext()); // Recursive call freeAndMerge(pointer2free); } if (!pointer2free.isFree()) { pointer2free.setFree(true); pointer2free.setClazz(null); pointers.add(pointer2free); } } }