, с циклом, чтобы повторить попытку операции при неудаче. Цикл не может быть бесконечным, поскольку существуют патологические случаи, когда конкретная конфигурация кучи приводит к тому, что сборщик мусора никогда не очищает отображение. Тем не менее, цикл около 10 будет охватывать почти все случаи. Если к этому моменту объект не исчез, то он никуда не денется, и приложение должно будет сдаться. Это может показаться неадекватным, но на практике это крайне маловероятно и будет проблемой только для JVM, которая не поддерживает очистители.

ользую ввод-вывод в память для индексного файла, но проблема в том, что я не могу изменить размер файла, если он в основном пустой.

Где-то раньше:

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

Изменение размера:

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

При использовании Windows или Linux 32-bit у меня часто возникает проблема с отображением, но в 64-битной среде Linux все работает без предупреждений, но файл сохраняет свой первоначальный размер.

Кто-нибудь может объяснить, почему это происходит и / или как решить проблему?

Ответы на вопрос(2)

Ваш ответ на вопрос