Compatibilidad con Java de 32 bits frente a 64 bits

¿Funcionará el código de Java creado y comstackdo contra un JDK de 32 bits en código de bytes de 32 bits en una JVM de 64 bits? ¿O una JVM de 64 bits requiere un código de bytes de 64 bits?

Para dar un poco más de detalle, tengo un código que funcionaba en un entorno Solaris que ejecutaba una JVM de 32 bits, pero ahora recibo problemas después de actualizar el servidor JDK y Weblogic a 64 bits.

Sí, Java bytecode (y el código fuente) es independiente de la plataforma, suponiendo que utilice librerías independientes de la plataforma. 32 contra 64 bits no deberían importar.

Accidentalmente ejecuté nuestra aplicación (de gran tamaño) en una máquina virtual de 64 bits en lugar de una máquina virtual de 32 bits y no me di cuenta hasta que algunas bibliotecas externas (llamadas por JNI) comenzaron a fallar.

Los datos serializados en una plataforma de 32 bits se leyeron en la plataforma de 64 bits sin problemas.

¿Qué tipo de problemas estás recibiendo? ¿Funcionan algunas cosas y otras no? ¿Has intentado conectar JConsole, etc. y tener un pico alrededor?

Si tiene una máquina virtual muy grande, puede descubrir que los problemas de GC en 64 bits pueden afectarlo.

Sí a la primera pregunta y no a la segunda pregunta; es una máquina virtual. Sus problemas probablemente están relacionados con cambios no especificados en la implementación de la biblioteca entre versiones. Aunque podría ser, por ejemplo, una condición de carrera.

Hay algunos aros que la máquina virtual tiene que pasar. En particular, las referencias se tratan en archivos de clase como si tomaran el mismo espacio que int en la stack. double y long ocupan dos ranuras de referencia. Para los campos de instancia, hay una reorganización de la máquina virtual por lo general pasa de todos modos. Todo esto se hace (relativamente) de manera transparente.

También algunas JVM de 64 bits usan “oops comprimidos”. Debido a que los datos se alinean alrededor de cada 8 o 16 bytes, tres o cuatro bits de la dirección son inútiles (aunque un bit de “marca” puede ser robado para algunos algoritmos). Esto permite datos de direcciones de 32 bits (por lo tanto, utilizando la mitad del ancho de banda y, por lo tanto, más rápido) para usar tamaños de almacenamiento dynamic de 35 o 36 bits en una plataforma de 64 bits.

Todo el código de bytes está basado en 8 bits. (Es por eso que se llama código BYTE) Todas las instrucciones son un múltiplo de 8 bits de tamaño. Desarrollamos en máquinas de 32 bits y ejecutamos nuestros servidores con JVM de 64 bits.

¿Podría darnos algún detalle del problema que enfrenta? Entonces podríamos tener la oportunidad de ayudarte. De lo contrario, solo estaríamos adivinando cuál es el problema que estás teniendo.

A menos que tenga código nativo (código de máquina comstackdo para una edición de arco específica) su código funcionará igual de bien en una JVM de 32 y 64 bits.

Sin embargo, tenga en cuenta que, debido a las direcciones más grandes (32 bits es 4 bytes, 64 bits es 8 bytes), una JVM de 64 bits requerirá más memoria que una JVM de 32 bits para la misma tarea.

La diferencia entre 32 bits y 64 bits se vuelve más importante cuando interactúa con bibliotecas nativas. 64 bits de Java no podrán interactuar con un dll de 32 bits que no sea Java (a través de JNI)

Agregue un parámetro como se indica a continuación en la configuración al crear el archivo exe

http://www.technimi.com/index.php?do=/group/java/forum/building-an-exe-using-launch4j-for-32-bit-jvm/

Espero que ayude.

Gracias…

/ jav

Java JNI requiere bibliotecas de sistema operativo con el mismo “bittiness” que la JVM. Si intenta construir algo que dependa, por ejemplo, en IESHIMS.DLL (vive en% ProgramFiles% \ Internet Explorer), necesita tomar la versión de 32 bits cuando su JVM es de 32 bits, la versión de 64 bits cuando su JVM es de 64 bits. Del mismo modo para otras plataformas.

Aparte de eso, debes estar todo listo. El bytecode Java generado s / b es el mismo.

Tenga en cuenta que debe usar el comstackdor Java de 64 bits para proyectos más grandes, ya que puede ocupar más memoria.

¡Tu estabas equivocado! Para este tema, escribí una pregunta al oracle. La respuesta fue

“Si comstack su código en una máquina de 32 bits, su código solo debe ejecutarse en un procesador de 32 bits. Si desea ejecutar su código en una JVM de 64 bits, debe comstackr sus archivos de clase en una máquina de 64 bits usando un 64 -Bit JDK “.