Datei-Memory-Mapping
Dateien größer als 2 GB mit deterministischer Bereinigung über MemorySegment abbilden.
Code-Vergleich
✕ 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
Problem mit diesem Code entdeckt? Sag uns Bescheid.
Warum der moderne Weg gewinnt
Keine Größenbeschränkung
Dateien größer als 2 GB ohne Umwege abbilden.
Deterministische Bereinigung
Arena stellt sicher, dass der Speicher beim Verlassen des Gültigkeitsbereichs freigegeben wird, nicht erst beim GC.
Bessere Performance
Abgestimmt auf moderne Speichermodelle und Hardware.
Alter Ansatz
MappedByteBuffer
Moderner Ansatz
MemorySegment mit Arena
Seit JDK
22
Schwierigkeitsgrad
Experte
JDK-Unterstützung
Datei-Memory-Mapping
Verfügbar
Verfügbar seit JDK 22 (März 2024)
Wie es funktioniert
Die Foreign Function & Memory API (JEP 454) führt MemorySegment für sicheren und effizienten Speicherzugriff ein. Im Gegensatz zu MappedByteBuffer unterstützt MemorySegment Dateien größer als 2 GB (Integer.MAX_VALUE), bietet deterministische Bereinigung über Arena und bessere Performance mit moderner Hardware.
Zugehörige Dokumentation