Mappatura in memoria di file
Mappa file più grandi di 2 GB con pulizia deterministica usando MemorySegment.
Confronto Codice
✕ 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.
Perché vince l'approccio moderno
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
Supporto JDK
Mappatura in memoria di file
Disponibile
Disponibile dal JDK 22 (marzo 2024)
Come funziona
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.
Documentazione Correlata