2009-04-23 28 views
95

¿Funcionará el código Java 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 un código de bytes de 64 bits?Compatibilidad con Java de 32 bits frente a 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 estoy teniendo problemas después de actualizar el JDK y el servidor Weblogic a 64 bits.

+3

aclare los "problemas". –

+0

Tengo un problema similar: implementar una aplicación de primavera en un servidor weblogic de 64 bits. Obtenemos varias excepciones de clase no encontradas, y otros errores inútiles. Además, se implementa y se ejecuta en algunas máquinas de 64 bits, pero no en otras. Sin embargo, no podemos decir qué es diferente. ¿Has resuelto esto? – nont

+2

@nont: sea cual sea el problema, no es una compilación de 32vs64 bits. –

Respuesta

90

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

+0

Me encontré con esto mientras buscaba una pregunta que tenía. SO, ejecuté mi aplicación en una JVM de 32 bits y utilicé una biblioteca nativa de 64 bits. Funcionó bien. Pero cuando ejecuto mi aplicación en una JVM de 64 bits y uso una biblioteca nativa de 32 bits, falla. ¿Cómo puede ser esto posible? Sólo curioso. –

+6

@umangdesai las bibliotecas nativas no son bibliotecas independientes de la plataforma, por lo tanto, la suposición no es válida. –

+0

¿"No debería importar" significa que el código compilado con 'javac' de 32 bits aprovechará la memoria disponible con' java' de 64 bits? –

11

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 VM debe atravesar. En particular, las referencias se tratan en archivos de clase como si ocuparan el mismo espacio que int s en la pila. 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 utilizan "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 dinámico de 35 o 36 bits en una plataforma de 64 bits.

+3

Me sorprende. No pensé que existiera el código de bytes de 32 bits o el código de bytes de 64 bits. –

+3

Releyendo su respuesta, ¿está seguro de que no solo lo dijo al revés? (Sí, entonces no). –

+0

+1 a Jon Skeet. Estaba escribiendo el mismo comentario pero me llamaron. –

20

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á 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 encontrar problemas de GC en 64 bits que pueden afectarlo.

+1

¿Está diciendo que las bibliotecas JNI no funcionarán en una máquina virtual de 64 bits si son de 32 bits? –

+0

No lo hicieron en el nuestro. Pero ha pasado un tiempo desde que lo intenté – Fortyrunner

+1

No funcionan. Un colega había informado que lo hicieron (lo cual me pareció sospechoso, por decir lo menos). Me preguntaba si estaba corriendo en Solaris y que había algún tipo de ruido. No hubo; estaba equivocado y corría por debajo de 32 bits. – Fortyrunner

10

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 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ás teniendo.

8

A menos que tenga código nativo (código de máquina compilado para una edición de arco), su código funcionará igual de bien en una JVM de 32 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.

+0

También tenga en cuenta que una JVM de 32 bits en un sistema de 64 bits puede tener más memoria disponible que una 32- Bit JVM en un sistema de 32 bits, por lo que podría ser una opción interesante si tiene una aplicación "use unos GB de memoria". –

-5

yo where wrong! Para este tema, escribí una pregunta al oráculo. 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 los archivos de la clase en un 64 bits Máquina que usa un JDK de 64 bits ".

+5

El [código de formato de byte] (http://java.sun.com/docs/books/jvms/second_edition/html/ClassFile.doc.html) generalmente se compila el código Java para que sea el mismo independientemente de las plataformas de 32 bits o de 64 bits. _Las reglas son diferentes para cualquier código nativo, pero el código de bytes de Java es portable._ – McDowell

+4

Sí, parece que quienquiera que haya contestado tu pregunta en Oracle no entendió bien o no sabía nada acerca de la JVM. –

3

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

+5

No proporcionó nada nuevo a esta vieja pregunta. –

0

Java JNI requiere bibliotecas de sistema operativo con el mismo "bitness" 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, debe tener todo listo. El bytecode Java generado s/b es el mismo.

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

Cuestiones relacionadas