I/O Avanzato

Mappa file più grandi di 2 GB con pulizia deterministica usando 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
Vedi un problema con questo codice? Faccelo sapere.
📏

Nessun limite di dimensione

Mappa file più grandi di 2 GB senza workaround.

🔒

Pulizia deterministica

Arena garantisce che la memoria venga liberata all'uscita dello scope, non al momento del GC.

Prestazioni migliori

Allineato con i moderni modelli di memoria e hardware.

Approccio Vecchio
MappedByteBuffer
Approccio Moderno
MemorySegment con Arena
Dal JDK
22
Difficoltà
Avanzato
Mappatura in memoria di file
Disponibile

Disponibile dal JDK 22 (marzo 2024)

L'API Foreign Function & Memory (JEP 454) introduce MemorySegment per un accesso sicuro ed efficiente alla memoria. A differenza di MappedByteBuffer, MemorySegment supporta file più grandi di 2 GB (Integer.MAX_VALUE), fornisce pulizia deterministica tramite Arena e offre prestazioni migliori con l'hardware moderno.

Condividi 𝕏 🦋 in