Truncar archivo mapeado de memoria

Estoy usando IO mapeado de memoria para un archivo de índice, pero el problema es que no puedo cambiar el tamaño del archivo si está mayormente vacío.

En algún lugar antes:

MappedByteBuffer map = raf.getChannel().map(MapMode.READ_WRITE, 0, 1 << 30);
raf.close();
// use map
map.force();
map = null;

Resize:

for (int c = 0; c < 100; c++) {
    RandomAccessFile raf = new RandomAccessFile(indexFile, "rw");
    try {
        raf.setLength(newLen);
        if (c > 0) LOG.warn("used " + c + " iterations to close mapped byte buffer");
        return;
    } catch (Exception e) {
        System.gc();
        Thread.sleep(10);
        System.runFinalization();
        Thread.sleep(10);
    } finally {
        raf.close();
    }
}

Cuando uso Windows o Linux de 32 bits, a menudo tengo el problema de desasignar, pero en el entorno de producción de Linux de 64 bits todo parece funcionar sin advertencias, pero el archivo mantiene el tamaño original.

¿Alguien puede explicar por qué sucede esto y / o cómo resolver el problema?

Respuestas a la pregunta(2)

Su respuesta a la pregunta