Compatibilidad con Java de 32 bits vs 64 bits


¿Funcionará el código Java construido y compilado 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 código de bytes de 64 bits?

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

Author: Gregor, 2009-04-24

9 answers

Sí, el bytecode de Java (y el código fuente) es independiente de la plataforma, suponiendo que utilice bibliotecas independientes de la plataforma. 32 vs 64 bits no importa.

 91
Author: Zifre,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-04-23 21:50:37

Accidentalmente ejecuté nuestra aplicación (grande) en una VM de 64 bits en lugar de una VM 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 ningún problema.

¿Qué tipo de problemas tienes? ¿Algunas cosas funcionan y otras no? ¿Ha intentado conectar JConsole, etc. y tiene un pico alrededor?

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

 20
Author: Fortyrunner,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-04-23 21:59:07

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 bibliotecas entre versiones. Aunque podría ser, digamos, una condición de carrera.

Hay algunos aros que la VM tiene que pasar. Notablemente las referencias son tratadas en archivos de clase como si tomaran el mismo espacio que ints en la pila. double y long ocupan dos ranuras de referencia. Por ejemplo, los campos, hay algún reordenamiento de la VM normalmente pasa de todos modos. Todo esto se hace (relativamente) de manera transparente.

También algunas JVM de 64 bits usan "compressed oops". Debido a que los datos están alineados a 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 que los datos de direcciones de 32 bits (por lo tanto usando la mitad de ancho de banda, y por lo tanto más rápido) utilicen tamaños de pila de 35 o 36 bits en una plataforma de 64 bits.

 11
Author: Tom Hawtin - tackline,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-05-08 17:35:41

Todo el código de bytes está basado en 8 bits. (Es por eso que se llama código de BYTES) 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 dar algún detalle del problema al que se enfrenta? Entonces podríamos tener la oportunidad de ayudarte. De lo contrario, solo estaríamos adivinando cuál es el problema que está teniendo.

 10
Author: Peter Lawrey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-04-24 06:12:22

A menos que tenga código nativo (código máquina compilado para una arcitechture específica), su código se ejecutará igualmente bien en una JVM de 32 bits y 64 bits.

Tenga en cuenta, sin embargo, 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.

 8
Author: Thorbjørn Ravn Andersen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-04-24 08:15:11

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

 3
Author: John Thomas,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-09-05 20:16:21

Agregue un parámetro como se muestra a continuación en la configuración mientras crea el 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

 2
Author: javangelo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-11-10 05:09:17

El JNI Java requiere bibliotecas de SO de la misma "bittiness" que la JVM. Si intenta construir algo que depende, por ejemplo, de 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. Lo mismo para otras plataformas.

Aparte de eso, deberías estar listo. El bytecode Java generado s / b es el mismo.

Tenga en cuenta que debe usar el compilador Java de 64 bits para proyectos más grandes porque puede abordar más memoria.

 0
Author: thecarpy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-07-31 10:42:33

Yo donde mal! A este tema le escribí una pregunta a oracle. La respuesta fue.

"Si compila 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 compilar sus archivos de clase en una máquina de 64 bits utilizando un JDK de 64 Bits."

 -5
Author: elayer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-05-22 08:33:43