Mapping de fichiers en mémoire
Mappez des fichiers de plus de 2 Go avec un nettoyage déterministe en utilisant MemorySegment.
Comparaison de Code
✕ 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
Un problème avec ce code ? Dites-le nous.
Pourquoi la méthode moderne gagne
Sans limite de taille
Mappez des fichiers de plus de 2 Go sans solutions de contournement.
Nettoyage déterministe
Arena garantit que la mémoire est libérée à la sortie de la portée, pas lors du GC.
Meilleures performances
Aligné avec les modèles de mémoire et le matériel modernes.
Ancienne Approche
MappedByteBuffer
Approche Moderne
MemorySegment avec Arena
Depuis JDK
22
Difficulté
Avancé
Support JDK
Mapping de fichiers en mémoire
Disponible
Disponible depuis JDK 22 (mars 2024)
Comment ça fonctionne
L'API de fonctions étrangères et mémoire (JEP 454) introduit MemorySegment pour un accès mémoire sûr et efficace. Contrairement à MappedByteBuffer, MemorySegment supporte les fichiers de plus de 2 Go (Integer.MAX_VALUE), fournit un nettoyage déterministe via Arena, et offre de meilleures performances avec le matériel moderne.
Documentation Associée