I/O Продвинутый

Отображение файлов размером более 2 ГБ с детерминированной очисткой через MemorySegment.

✕ Java 8
try (FileChannel channel =
    FileChannel.open(path,
        StandardOpenOption.READ,
        StandardOpenOption.WRITE)) {
    MappedByteBuffer buffer =
        channel.map(
            FileChannel.MapMode.READ_WRITE,
            0, (int) channel.size());
    // Limited to 2GB
    // Freed by GC, no control
}
✓ Java 22+
FileChannel channel =
    FileChannel.open(path,
        StandardOpenOption.READ,
        StandardOpenOption.WRITE);
try (Arena arena = Arena.ofShared()) {
    MemorySegment segment =
        channel.map(
            FileChannel.MapMode.READ_WRITE,
            0, channel.size(), arena);
    // No size limit
    // ...
} // Deterministic cleanup
Заметили проблему в этом коде? Сообщите нам.
📏

Без ограничений по размеру

Отображение файлов размером более 2 ГБ без обходных путей.

🔒

Детерминированная очистка

Arena гарантирует освобождение памяти при выходе из области видимости, а не при сборке мусора.

Лучшая производительность

Оптимизировано для современных моделей памяти и оборудования.

Старый подход
MappedByteBuffer
Современный подход
MemorySegment с Arena
Начиная с JDK
22
Сложность
Продвинутый
Отображение файлов в память
Доступно

Доступно в JDK 22 (март 2024)

Foreign Function & Memory API (JEP 454) вводит MemorySegment для безопасного и эффективного доступа к памяти. В отличие от MappedByteBuffer, MemorySegment поддерживает файлы размером более 2 ГБ (Integer.MAX_VALUE), обеспечивает детерминированную очистку через Arena и лучшую производительность на современном оборудовании.