Mapowanie pliku w pamięci
Mapuj pliki większe niż 2 GB z deterministycznym czyszczeniem za pomocą MemorySegment.
Porównanie kodu
✕ 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
Widzisz problem z tym kodem? Daj nam znać.
Dlaczego nowoczesne podejście wygrywa
Brak ograniczenia rozmiaru
Mapuj pliki większe niż 2 GB bez obejść.
Deterministyczne czyszczenie
Arena zapewnia zwolnienie pamięci po zakończeniu zasięgu, nie w czasie GC.
Lepsza wydajność
Dostosowany do nowoczesnych modeli pamięci i sprzętu.
Stare podejście
MappedByteBuffer
Nowoczesne podejście
MemorySegment z Arena
Od JDK
22
Poziom trudności
Zaawansowany
Wsparcie JDK
Mapowanie pliku w pamięci
Dostępne
Dostępne od JDK 22 (marzec 2024)
Jak to działa
Foreign Function & Memory API (JEP 454) wprowadza MemorySegment do bezpiecznego i wydajnego dostępu do pamięci. W przeciwieństwie do MappedByteBuffer, MemorySegment obsługuje pliki większe niż 2 GB, zapewnia deterministyczne czyszczenie przez Arena i oferuje lepszą wydajność na nowoczesnym sprzęcie.
Powiązana dokumentacja
Dowód