I/O Avancé

Mappez des fichiers de plus de 2 Go avec un nettoyage déterministe en utilisant 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
Un problème avec ce code ? Dites-le nous.
📏

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é
Mapping de fichiers en mémoire
Disponible

Disponible depuis JDK 22 (mars 2024)

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.

Partager 𝕏 🦋 in