0Pricing
Java Academy · Lección

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ícito
  • Arena.ofShared(): acceso desde varios hilos
  • Arena.global(): nunca se libera
  • Arena.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ímites
  • Arena: controla la vida útil (confinado, compartido, automático y global)
  • Acceso tipado mediante ValueLayout con get/set y getAtIndex
  • 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

  1. Por qué FFM en lugar de JNI
  2. MemorySegment y Arena
  3. Handles de downcall
  4. Layouts y structs
← Volver a Java Academy