Mapeamento de arquivos em memória
Mapeie arquivos maiores que 2GB com limpeza determinística usando MemorySegment.
Comparação de Código
✕ 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
Viu um problema com este código? Nos avise.
Por que a forma moderna ganha
Sem limite de tamanho
Mapeie arquivos maiores que 2GB sem soluções alternativas.
Limpeza determinística
Arena garante que a memória é liberada ao sair do escopo, não pelo GC.
Melhor desempenho
Alinhado com modelos de memória e hardware modernos.
Abordagem Antiga
MappedByteBuffer
Abordagem Moderna
MemorySegment com Arena
Desde o JDK
22
Dificuldade
Avançado
Suporte JDK
Mapeamento de arquivos em memória
Disponível
Disponível desde o JDK 22 (março de 2024)
Como funciona
A API Foreign Function & Memory (JEP 454) introduz o MemorySegment para acesso seguro e eficiente à memória. Diferente do MappedByteBuffer, o MemorySegment suporta arquivos maiores que 2GB (Integer.MAX_VALUE), oferece limpeza determinística via Arena e melhor desempenho com hardware moderno.
Documentação Relacionada