Отображение файлов в память
Отображение файлов размером более 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
Отображение файлов в память
Доступно
Доступно в JDK 22 (март 2024)
Как это работает
Foreign Function & Memory API (JEP 454) вводит MemorySegment для безопасного и эффективного доступа к памяти. В отличие от MappedByteBuffer, MemorySegment поддерживает файлы размером более 2 ГБ (Integer.MAX_VALUE), обеспечивает детерминированную очистку через Arena и лучшую производительность на современном оборудовании.
Связанная документация
Доказательство