I/O Experte

Dateien größer als 2 GB mit deterministischer Bereinigung über MemorySegment abbilden.

✕ 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.
📏

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
Datei-Memory-Mapping
Verfügbar

Verfügbar seit JDK 22 (März 2024)

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.

Teilen 𝕏 🦋 in