Dosya bellek eşleme
MemorySegment kullanarak 2 GB'tan büyük dosyaları belirleyici temizlemeyle eşleyin.
Kod Karşılaştırması
✕ 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
Bu kodda bir sorun mu gördünüz? Bize bildirin.
Modern yöntem neden daha iyi
Boyut sınırı yok
Geçici çözümler olmadan 2 GB'tan büyük dosyaları eşleyin.
Belirleyici temizleme
Arena, belleğin GC zamanında değil kapsam çıkışında serbest bırakılmasını sağlar.
Daha iyi performans
Modern bellek modelleri ve donanımla uyumlu.
Eski Yaklaşım
MappedByteBuffer
Modern Yaklaşım
Arena ile MemorySegment
JDK'dan itibaren
22
Zorluk
İleri
JDK Desteği
Dosya bellek eşleme
Mevcut
JDK 22'den itibaren kullanılabilir (Mart 2024)
Nasıl çalışır
Foreign Function & Memory API (JEP 454), güvenli ve verimli bellek erişimi için MemorySegment'i tanıtır. MappedByteBuffer'dan farklı olarak MemorySegment, 2 GB'tan (Integer.MAX_VALUE) büyük dosyaları destekler, Arena aracılığıyla belirleyici temizleme sağlar ve modern donanımla daha iyi performans sunar.
İlgili Belgeler