I/O Zaawansowany

Mapuj pliki większe niż 2 GB z deterministycznym czyszczeniem za pomocą 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
Widzisz problem z tym kodem? Daj nam znać.
📏

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
Mapowanie pliku w pamięci
Dostępne

Dostępne od JDK 22 (marzec 2024)

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.