MemorySegment y Arena
Asigne memoria fuera del heap
MemorySegment y Arena es una lección gratuita de Java Academy en CoddyKit. Esta es la lección 2 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de Java Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de Java Academy incluye 4 lecciones en total.
Memoria fuera del heap
FFM modela la memoria nativa fuera del heap mediante dos tipos centrales: MemorySegment representa una región contigua de memoria y Arena controla su vida útil.
Juntos sustituyen la administración manual e insegura de búferes que se utilizaba anteriormente.
Qué es un MemorySegment
Un MemorySegment es una vista tipada sobre un bloque de memoria. Conoce su tamaño y su vida útil, y cada acceso comprueba los límites.
Los segmentos pueden estar fuera del heap (ser nativos) o envolver un array alojado en el heap.
Qué es un Arena
Un Arena asigna segmentos y determina cuándo se liberan. Cuando se cierra el Arena, todos sus segmentos dejan de ser válidos en un único paso determinista.
Arena.ofConfined(): un solo hilo, cierre explícitoArena.ofShared(): acceso desde varios hilosArena.global(): nunca se liberaArena.ofAuto(): el GC lo libera
Asignar un segmento
Un Arena confinado dentro de try-with-resources es el patrón habitual. Asigne los bytes, utilícelos y el cierre lo liberará todo.
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");
}
}Escritura y lectura
Puede leer y escribir mediante accesores tipados que reciben un ValueLayout y un desplazamiento. Así se mantienen el acceso con tipos seguros y la alineación.
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);
}
}
}Asignar posiciones tipadas
En lugar de indicar cantidades de bytes sin tipo, asigne según el layout. arena.allocate(JAVA_INT) reserva exactamente los bytes necesarios y correctamente alineados para un int.
Esto evita calcular manualmente los tamaños.
Arrays de valores
Para almacenar varios elementos, asigne un layout de secuencia o proporcione una cantidad. El acceso mediante índices utiliza un desplazamiento calculado a partir del tamaño del 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));
}
}
}Comprobación de límites
Leer o escribir fuera de un segmento genera IndexOutOfBoundsException. Acceder a un segmento después de que se haya cerrado su Arena genera IllegalStateException.
Estas comprobaciones hacen que la memoria de FFM sea segura, a diferencia de la de JNI.
Confinamiento
Un Arena confinado vincula sus segmentos al hilo que los creó. Si otro hilo accede a ellos, se genera WrongThreadException.
Para compartir memoria realmente, utilice Arena.ofShared(), que permite el acceso desde varios hilos con un pequeño coste.
Trabajar con cadenas
FFM ofrece utilidades para conectar las cadenas de Java con las cadenas de C. allocateUtf8String (en versiones más recientes: allocateFrom) escribe una cadena terminada en nulo, y getUtf8String lee una.
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));
}
}
}Elegir un Arena
Directrices:
- Búferes de corta duración para un solo hilo:
ofConfined() - Compartidos entre varios hilos:
ofShared() - Vida útil administrada por el GC:
ofAuto() - Constantes para todo el proceso:
global()
Comprobación rápida
Recuerde qué determina cuándo se libera la memoria nativa.
Resumen
Ha aprendido a administrar memoria fuera del heap:
MemorySegment: una región de memoria con comprobación de límitesArena: controla la vida útil (confinado, compartido, automático y global)- Acceso tipado mediante
ValueLayoutconget/setygetAtIndex - Seguridad gracias a la comprobación de límites y al confinamiento
A continuación: llamar a funciones nativas con handles downcall.
Preguntas frecuentes
¿La lección «MemorySegment y Arena» es gratis?
Sí — el texto completo de «MemorySegment y Arena» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de Java Academy, actualiza a CoddyKit PRO. El curso de Java Academy incluye 4 lecciones en total.
¿Qué aprenderé en «MemorySegment y Arena»?
Asigne memoria fuera del heap Practicas Java Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.
¿Necesito experiencia previa para empezar Java Academy?
No se requiere experiencia previa. Java Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 2 de 4.
¿Cuánto tiempo toma la lección «MemorySegment y Arena»?
La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.
¿Puedo escribir y ejecutar código en esta lección de Java Academy?
Sí. Cada lección de Java Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.
Todas las lecciones de este curso
- Por qué FFM en lugar de JNI
- MemorySegment y Arena
- Handles de downcall
- Layouts y structs