Consideraciones generales sobre la portabilidad
Deberá tener en cuenta una serie de problemas antes de portar aplicaciones Java™ a sistemas de 64 bits.
La plataforma Java en procesadores de 64 bits
- En sistemas de 32 bits, el espacio máximo de almacenamiento dinámico de Java (donde los objetos Java se mantienen en tiempo de ejecución) es de 4GB, o 2GB en sistemas z/OS® de 31 bits, mientras que los sistemas de 64 bits pueden tener espacios de almacenamiento dinámico de hasta (y hasta) 32GB. Este espacio de almacenamiento dinámico más grande es esencial para que las aplicaciones Java puedan utilizar todas las prestaciones de sistemas grandes y potentes.
- Algunas aplicaciones Java utilizan código nativo a través de JNI (Java Native Interface), donde el código nativo es de 64 bits. Por ejemplo, el controlador Java Database Connectivity (JDBC) se escribe en código nativo de 64 bits en una plataforma de 64 bits.
- Algunas aplicaciones Java requieren otras prestaciones mejoradas de sistemas de 64 bits.
La API de Java y la portabilidad de código nativo

El diagrama anterior es útil para identificar componentes significativos y para comprender qué es necesario cambiar al portar aplicaciones de 32 bits a 64 bits. Todas las aplicaciones Java se escriben en una interfaz de programación de aplicaciones (API) Java definida. Esta API es la misma para las versiones de 32 bits y 64 bits de la plataforma Java.
La API de Java incluye las bibliotecas de clase Java (por ejemplo, awt, swing, net, lang, ioy rmi) que son una parte fundamental de la plataforma Java. La API de Java, y todo el código Java, es exactamente igual en una implementación de 64 bits que en una implementación de 32 bits . Por lo tanto, si tiene código de aplicación Java que se ejecuta en un sistema Java de 32 bits , se ejecuta sin cambios en un sistema de 64 bits.
Muchas aplicaciones Java no están escritas al 100% en el lenguaje Java. Para estas aplicaciones, parte de su código está escrito en un lenguaje no Java, como por ejemplo C o C++, que generalmente se conoce como "código nativo". Portar aplicaciones Java que tienen código nativo requiere más esfuerzo.
La máquina virtual Java (Java VM) ejecuta todo el código Java (la aplicación y las bibliotecas de clases). La máquina virtual Java contiene subcomponentes que ejecutan el código Java y gestionan los datos en el almacenamiento dinámico de Java. La máquina virtual J9 incluye un compilador justo a tiempo (JIT) que compila el código Java en instrucciones de procesador nativas antes de la ejecución. Este proceso de compilación maximiza el rendimiento del código.
En una implementación de 64 bits del entorno Java, es la máquina virtual Java que se implementa como un programa de 64 bits y que es consciente de la naturaleza de 64 bits del procesador subyacente. Esto incluye el compilador JIT, que debe compilar el código Java para utilizar direcciones de 64 bits. El compilador JIT también es consciente del conjunto de instrucciones completo de 64 bits disponible en el procesador subyacente.
La máquina virtual Java se comunica con el sistema operativo a través de la interfaz de puerto de host (HPI). Esta comunicación hace que el código de máquina virtual Java sea independiente del sistema operativo subyacente y permite que la implementación de IBM de la plataforma Java dé soporte a un rango de sistemas operativos en un tipo de procesador determinado.
JNI y código nativo
La máquina virtual Java, la capa HPI y el código Java se ejecutan en un único proceso de sistema operativo de 64 bits. Normalmente, hay algún código nativo que se ejecuta dentro del mismo proceso. El código nativo es una o varias bibliotecas de código compilado directamente para el procesador y el sistema operativo. Se accede al código nativo desde el código Java a través de JNI (Java Native Interface). El código nativo también puede acceder a objetos y métodos Java a través de JNI. Parte del código nativo forma parte de la implementación J2SE , como por ejemplo el código que implementa las clases Java awt utilizando las funciones de gráficos y ventanas proporcionadas por el sistema operativo. Se puede proporcionar otro código nativo como parte de una aplicación.
Hay otra interfaz que es similar a JNI: JVMTI (Java Virtual Machine Tool Interface). Esta interfaz proporciona prestaciones para la creación de perfiles y la depuración de aplicaciones Java. Para utilizar estas prestaciones, debe escribir algún código nativo.
En el caso de las implementaciones de 64 bits de la plataforma Java, todo el código nativo asociado con la máquina virtual Java de 64 bits debe ser de 64 bits, porque todo se ejecuta en el mismo espacio de proceso que la máquina virtual Java. No es posible ejecutar código de 64 bits y código de 32 bits dentro del mismo espacio de proceso debido a la incompatibilidad de los tamaños de dirección entre estos dos tipos de código.
El código nativo, normalmente escrito en los lenguajes C o C++, es directamente consciente del tamaño de las direcciones. Si la aplicación tiene código nativo, este se debe modificar para que funcione correctamente con las diferencias en entornos de 64 bits, como por ejemplo las direcciones de 64 bits. Finalmente, el código nativo también debe volverse a compilar y a vincular para el sistema de 64 bits.
En resumen, la implementación de la máquina virtual Java de 64 bits se ejecuta en un procesador de 64 bits y enlaza con el código que también es "consciente" de 64 bits. La máquina virtual Java también puede utilizar el soporte de memoria grande y las instrucciones de 64 bits del procesador subyacente. Las aplicaciones Java que ejecuta son exactamente las mismas que las que se pueden ejecutar en implementaciones de 32 bits de Java. Solo se debe portar el código nativo desde sistemas de 32 bits a sistemas de 64 bits.
La ventaja de los programas Java al pasar de 32 bits a 64 bits
El entorno y el lenguaje Java hacen que la transición de la informática de 32 bits a la informática de 64 bits sea sencilla. Para programas escritos en otros lenguajes que tienen punteros de dirección explícitos, como C y C++, portar una aplicación de 32 bits a 64 bits puede llevar un esfuerzo considerable. Esto se debe a que cada puntero debe volverse a declarar como una cantidad de 64 bits y cualquier cálculo relacionado con las direcciones debe ser comprobado y ajustado cuidadosamente para garantizar que se ejecute correctamente en el entorno de 64 bits. En cambio, el 100% de las aplicaciones Java ni siquiera necesitan ser recompiladas para ejecutarse correctamente en el entorno de 64 bits. Para las aplicaciones Java, todo el trabajo duro lo realiza la implementación de la máquina virtual Java, mientras que el tamaño del puntero subyacente está oculto de la vista.