MemorySegment e Arena
Aloque memória fora do heap.
MemorySegment e Arena é uma aula grátis de Java Academy no CoddyKit. Esta é a aula 2 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de Java Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de Java Academy inclui 4 aulas no total.
Memória fora da área gerenciada
FFM modela a memória nativa, fora da área gerenciada, com dois tipos centrais: MemorySegment representa uma região contígua de memória, e Arena controla seu tempo de vida.
Juntos, eles substituem o gerenciamento manual e inseguro de buffers do passado.
O que é um MemorySegment
Um MemorySegment é uma janela tipada sobre um bloco de memória. Ele conhece seu tamanho e seu tempo de vida, e todo acesso passa por uma verificação de limites.
Os segmentos podem estar fora da área gerenciada (nativos) ou envolver um vetor alocado na memória gerenciada.
O que é uma Arena
Uma Arena aloca segmentos e define quando eles são liberados. Quando a arena é fechada, todos os seus segmentos se tornam inválidos em uma única etapa determinística.
Arena.ofConfined(): uma única linha de execução, fechamento explícitoArena.ofShared(): acesso por várias linhas de execuçãoArena.global(): nunca é liberadaArena.ofAuto(): liberada pelo coletor de lixo
Alocando um segmento
Usar uma arena confinada com fechamento automático de recursos é o padrão típico. Aloque os bytes, use-os, e o fechamento liberará tudo.
import java.lang.foreign.*;
public class Main {
public static void main(String[] args) {
try (Arena arena = Arena.ofConfined()) {
MemorySegment seg = arena.allocate(16);
System.out.println("Allocated bytes: " + seg.byteSize());
}
System.out.println("Arena closed, memory freed");
}
}Escrevendo e lendo
Você lê e grava por meio de acessadores tipados que recebem um ValueLayout e um deslocamento. Isso mantém o acesso seguro quanto ao tipo e corretamente alinhado.
import java.lang.foreign.*;
public class Main {
public static void main(String[] args) {
try (Arena arena = Arena.ofConfined()) {
MemorySegment seg = arena.allocate(ValueLayout.JAVA_INT);
seg.set(ValueLayout.JAVA_INT, 0, 42);
int value = seg.get(ValueLayout.JAVA_INT, 0);
System.out.println("Stored and read: " + value);
}
}
}Alocando posições tipadas
Em vez de usar contagens brutas de bytes, aloque por descrição. arena.allocate(JAVA_INT) reserva exatamente a quantidade necessária, em bytes corretamente alinhados, para um inteiro.
Isso evita cálculos manuais de tamanho.
Vetores de valores
Para armazenar vários elementos, aloque uma descrição de sequência ou informe uma quantidade. O acesso por índice usa um deslocamento calculado a partir do tamanho do elemento.
import java.lang.foreign.*;
public class Main {
public static void main(String[] args) {
try (Arena arena = Arena.ofConfined()) {
MemorySegment ints = arena.allocate(ValueLayout.JAVA_INT, 5);
for (int i = 0; i < 5; i++) {
ints.setAtIndex(ValueLayout.JAVA_INT, i, i * 10);
}
System.out.println("Element 3: " + ints.getAtIndex(ValueLayout.JAVA_INT, 3));
}
}
}Verificação de limites
Ler ou gravar fora de um segmento gera IndexOutOfBoundsException. Acessar um segmento depois que sua arena foi fechada gera IllegalStateException.
Essas verificações tornam a memória do FFM segura, ao contrário do que ocorria com JNI.
Confinamento
Uma arena confinada vincula seus segmentos à linha de execução que os criou. O acesso por outra linha de execução gera WrongThreadException.
Para memória realmente compartilhada, use Arena.ofShared(), que permite o acesso por várias linhas de execução com um pequeno custo.
Trabalhando com cadeias de caracteres
FFM oferece auxiliares para conectar cadeias de caracteres Java e cadeias de caracteres C. allocateUtf8String (mais recente: allocateFrom) grava uma cadeia terminada em nulo, e getUtf8String lê uma de volta.
import java.lang.foreign.*;
public class Main {
public static void main(String[] args) {
try (Arena arena = Arena.ofConfined()) {
MemorySegment cString = arena.allocateUtf8String("hello");
System.out.println("Read back: " + cString.getUtf8String(0));
}
}
}Escolhendo uma Arena
Orientações:
- Buffers de curta duração e uma única linha de execução:
ofConfined() - Compartilhados entre linhas de execução:
ofShared() - Tempo de vida gerenciado pelo coletor de lixo:
ofAuto() - Constantes disponíveis em todo o processo:
global()
Verificação rápida
Lembre-se do que determina quando a memória nativa é liberada.
Recapitulação
Você aprendeu a gerenciar memória fora da área gerenciada:
MemorySegment: uma região de memória com verificação de limitesArena: controla o tempo de vida (confinada, compartilhada, automática ou global)- Acesso tipado por meio de
ValueLayoutcomget/setegetAtIndex - Segurança proporcionada pela verificação de limites e pelo confinamento
A seguir: chamar funções nativas com identificadores de chamadas descendentes.
Perguntas Frequentes
A aula “MemorySegment e Arena” é grátis?
Sim — o texto completo de “MemorySegment e Arena” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de Java Academy, atualize para CoddyKit PRO. O curso de Java Academy inclui 4 aulas no total.
O que vou aprender em “MemorySegment e Arena”?
Aloque memória fora do heap. Você pratica Java Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.
Preciso ter experiência prévia para começar Java Academy?
Nenhuma experiência prévia é necessária. Java Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 2 de 4.
Quanto tempo leva a aula “MemorySegment e Arena”?
A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.
Posso escrever e executar código nesta aula de Java Academy?
Sim. Cada aula de Java Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.
Todas as aulas deste curso
- Por que FFM em vez de JNI
- MemorySegment e Arena
- Handles de downcall
- Layouts e structs