El proyecto Valhalla es un proyecto experimental de OpenJDK para desarrollar nuevas características importantes del lenguaje para Java 10 y posteriores. El proyecto se anunció en julio de 2014 y es un esfuerzo experimental de Oracle , dirigido por el ingeniero Brian Goetz. [1]
Valhalla está incubando características y mejoras del lenguaje Java en estas áreas: [2]
List<int>
por ejemplo.Estas funciones requerirán cambios tanto en la sintaxis como en el nivel de VM.
El proyecto está organizado en la lista de correo 'Project Valhalla' de OpenJDK. El proyecto Valhalla ha comenzado en las etapas experimentales, con un anuncio inaugural y propuestas iniciales preliminares.
Publicado a partir de enero de 2022:
También se pueden crear prototipos experimentales de OpenJDK desde los repositorios de Mercurial. Estos están empezando a incorporar muchas características de especialización. Tenga en cuenta que se trata de fuentes de Gnu Make/C++ y que la creación de OpenJDK requiere conocimientos técnicos. Consulte las instrucciones de creación de OpenJDK para obtener más detalles.
El proyecto está organizado en varias JEP (propuestas de mejora del JDK):
Las clases de valor son tipos de referencia, al igual que todas las clases Java existentes. Sin embargo, renuncian a la capacidad de tener identidad. Esto significa que el ==
operador compara las instancias de la clase de valor por la igualdad de sus componentes, en lugar de por identidad. Además, la sincronización en instancias de clases de valor fallará.
Las clases de valor aún admiten null
, ya que son tipos de referencia. Se espera que la máquina virtual Java pueda aprovechar las restricciones adicionales de las clases de valor para eliminar la asignación de tipos de valor en el montón en la gran mayoría de los casos. Sin embargo, el almacenamiento de instancias de clases de valor en un campo o su conversión a una interfaz seguirá requiriendo una asignación.
Los tipos existentes en la API de Java se conocen como clases basadas en valores y son candidatos para convertirse en clases de valores en una futura versión del JDK.java.util.Optional
Las clases primitivas están sujetas a todas las restricciones de las clases de valor, pero no son tipos de referencia. Esto significa que renuncian a la capacidad de admitir null
. En cambio, sus valores predeterminados son el valor cero para cada uno de los tipos de componentes ( 0
para tipos numéricos, false
para booleanos, null
para tipos de referencia y el valor cero para clases primitivas anidadas).
Todas las clases primitivas se almacenan "en línea", es decir, sin necesidad de una asignación de montón. Las matrices de clases primitivas no requerirán una indirección de puntero desde la matriz al montón. Cuando sea necesario, se insertarán conversiones para "encajar" la clase primitiva en una versión de clase de valor de sí misma y viceversa.
Este JEP está destinado a expresar los tipos primitivos clásicos de la Máquina Virtual Java (byte, char, short, int, long, boolean, float, double) como clases primitivas.
Tradicionalmente, los ocho tipos primitivos se tratan por separado de todos los demás tipos. Al proporcionar declaraciones de clase primitivas a partir de ellos, se elimina gran parte de este uso especial de mayúsculas y minúsculas, lo que da lugar a un sistema de tipos más elegante y fácil de entender.
El rendimiento del acceso a la memoria y la eficiencia del acceso a valores "encapsulados" son áreas importantes que deben abordarse con estas características. Las características de "Tipo de valor" y "Especialización genérica" (cuando se aplican a listas o colecciones) reducen el uso de memoria, pero lo que es más importante, evitan la indirección de punteros que generalmente causa una falla de caché. [7] [8]
En lugar de una lista o matriz de referencias de objetos que apunten a valores de datos dispersos por toda la memoria, las mejoras del Proyecto Valhalla permitirán que los valores de listas o matrices se distribuyan potencialmente de forma lineal (sin indirección) como un bloque consecutivo de memoria.
Los tipos de valor se conciben como "códigos como una clase, ¡funcionan como un int!" [9] La sincronización y la herencia quedarían excluidas para los tipos de valor. Estos ya no requerirían identidad de objeto y sobrecargas de memoria/puntero asociadas, aunque podrían asumir una forma "en caja" para compatibilidad. [8]