Truncar arquivo mapeado de memória

Estou usando E / S mapeada na memória para um arquivo de índice, mas o problema é que não consigo redimensionar o arquivo se estiver quase vazi

Em algum 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();
    }
}

Ao usar o Windows ou Linux de 32 bits, geralmente tenho o problema de desmapeamento, mas no ambiente de produção Linux de 64 bits tudo parece funcionar sem avisos, mas o arquivo mantém o tamanho origina

Alguém pode explicar por que isso acontece e / ou como resolver o problem

questionAnswers(2)

yourAnswerToTheQuestion