Compatibilidade Java de 32 bits versus 64 bits

O código Java construído e compilado em um JDK de 32 bits em um código de byte de 32 bits funciona em uma JVM de 64 bits? Ou uma JVM de 64 bits requer um código de byte de 64 bits?

Para dar um pouco mais de detalhes, tenho código que estava trabalhando em um ambiente Solaris executando uma JVM de 32 bits, mas agora estou recebendo problemas após a atualização do JDK e do Weblogic Server para 64 bits.

Sim, o bytecode Java (e o código fonte) é independente da plataforma, supondo que você use bibliotecas independentes de plataforma. 32 contra 64 bits não importa.

Eu corri acidentalmente o nosso aplicativo (grande) em uma VM de 64 bits em vez de uma VM de 32 bits e não percebi até que algumas bibliotecas externas (chamadas pelo JNI) começaram a falhar.

Dados serializados em uma plataforma de 32 bits foram lidos na plataforma de 64 bits sem nenhum problema.

Que tipo de problemas você está recebendo? Algumas coisas funcionam e outras não? Você já tentou append o JConsole etc e tem um pico ao redor?

Se você tiver uma VM muito grande, poderá descobrir que os problemas de GC em 64 bits podem afetá-lo.

Sim à primeira questão e não à segunda questão; é uma máquina virtual. Seus problemas provavelmente estão relacionados a mudanças não especificadas na implementação da biblioteca entre as versões. Embora possa ser, digamos, uma condição de corrida.

Existem alguns arcos que a VM tem que percorrer. Notavelmente, as referências são tratadas em arquivos de class como se tivessem o mesmo espaço que os int na pilha. double e long ocupam dois slots de referência. Por exemplo, campos, há algum rearranjo que a VM geralmente passa de qualquer maneira. Tudo isso é feito (relativamente) de forma transparente.

Além disso, algumas JVMs de 64 bits usam “oops compactados”. Como os dados são alinhados em torno de 8 ou 16 bytes, três ou quatro bits do endereço são inúteis (embora um bit de “marca” possa ser roubado para alguns algoritmos). Isso permite dados de endereço de 32 bits (usando, portanto, metade da largura de banda e, portanto, mais rápido) para usar tamanhos de heap de 35 ou 36 bits em uma plataforma de 64 bits.

Todo o código de bytes é baseado em 8 bits. (É por isso que seu código BYTE chamado) Todas as instruções são um múltiplo de 8 bits de tamanho. Desenvolvemos em máquinas de 32 bits e executamos nossos servidores com JVM de 64 bits.

Você poderia dar alguns detalhes do problema que está enfrentando? Então podemos ter uma chance de te ajudar. Caso contrário, apenas estaríamos adivinhando qual é o problema que você está tendo.

A menos que você tenha código nativo (código de máquina compilado para uma arcitechture específica), seu código será executado igualmente bem em uma JVM de 32 e 64 bits.

Observe, no entanto, que, devido aos endereços maiores (32 bits é 4 bytes, 64 bits é 8 bytes), uma JVM de 64 bits exigirá mais memory que uma JVM de 32 bits para a mesma tarefa.

A diferença de 32 bits versus 64 bits se torna mais importante quando você faz interface com bibliotecas nativas. Java de 64 bits não poderá interagir com uma DLL não Java de 32 bits (via JNI)

Adicione um parâmetro como abaixo em você na configuração ao criar o exe

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

Espero que ajude.

obrigado…

/ jav

O Java JNI requer bibliotecas do SO com o mesmo “bittiness” que a JVM. Se você tentar construir algo que dependa, por exemplo, do arquivo IESHIMS.DLL (vive em% ProgramFiles% \ Internet Explorer), você precisa ter a versão de 32 bits quando sua JVM for de 32 bits, a versão de 64 bits quando sua JVM for de 64 bits. Da mesma forma para outras plataformas.

Além disso, você deve estar tudo pronto. O bytecode Java gerado s / b é o mesmo.

Observe que você deve usar o compilador Java de 64 bits para projetos maiores porque pode endereçar mais memory.

yo onde errado! Para este tema eu escrevi uma pergunta para oracle. A resposta foi.

“Se você compilar seu código em um 32 Bit Machine, seu código só deve rodar em um Processador de 32 Bit. Se você quer rodar seu código em uma JVM de 64 Bit você tem que compilar sua class Files em um 64 Bit Machine usando um 64 -Bit JDK.