web-dev-qa-db-fra.com

Java Compatibilité 32 bits ou 64 bits

Le code Java) créé et compilé sur un JDK 32 bits en code octet 32 ​​bits fonctionnera-t-il dans une machine virtuelle Java 64 bits? Ou une machine virtuelle Java 64 bits nécessite-t-elle un code octet 64 bits?

Pour vous donner un peu plus de détails, mon code fonctionnait dans un environnement Solaris exécutant une machine virtuelle Java 32 bits, mais je rencontre maintenant des problèmes après la mise à niveau du JDK et du serveur Weblogic en 64 bits.

96
mshafrir

Oui, Java) est indépendant de la plate-forme, en supposant que vous utilisiez des bibliothèques indépendantes de la plate-forme. Le 32 ou le 64 bits ne devraient pas avoir d'importance.

92
Zifre

J'ai accidentellement exécuté notre application (grand format) sur un 64bit VM plutôt que sur un 32bit VM et je ne l'avais pas remarqué jusqu'à ce que certaines bibliothèques externes (appelées par JNI) aient démarré échouer.

Les données sérialisées sur une plate-forme 32 bits ont été lues sur la plate-forme 64 bits sans aucun problème.

Quel genre de problèmes obtenez-vous? Certaines choses fonctionnent-elles et pas d'autres? Avez-vous essayé de fixer JConsole, etc. et avez-vous un maximum?

Si vous avez un très gros VM), vous constaterez peut-être que des problèmes de GC en 64 bits peuvent vous affecter.

20
Fortyrunner

Oui à la première question et non à la deuxième question; c'est une machine virtuelle. Vos problèmes sont probablement liés à des changements non spécifiés dans l’implémentation de la bibliothèque entre les versions. Bien que cela puisse être, disons, une condition de concurrence.

Il y a des cerceaux que VM doit traverser. Les références sont notamment traitées dans les fichiers de classe comme si elles utilisaient le même espace que ints sur la pile. double et long prennent deux emplacements de référence. Par exemple, il y a quelques réarrangements que VM passe de toute façon. Tout cela est fait (relativement) de manière transparente.

De plus, certaines machines virtuelles Java 64 bits utilisent des "oops compressés". Les données étant alignées sur environ tous les 8 ou 16 octets, trois ou quatre bits de l'adresse sont inutiles (bien qu'un bit de "marque" puisse être volé pour certains algorithmes). Cela permet aux données d'adresse 32 bits (utilisant donc deux fois moins de bande passante et donc plus rapides) d'utiliser des tailles de tas de 35 ou 36 bits sur une plate-forme 64 bits.

11

Tout le code d'octet est basé sur 8 bits. (C'est pourquoi on l'appelle code BYTE) Toutes les instructions ont une taille multiple de 8 bits. Nous développons sur des machines 32 bits et exploitons nos serveurs avec une machine virtuelle Java 64 bits.

Pourriez-vous donner quelques détails sur le problème que vous rencontrez? Nous pourrions alors avoir une chance de vous aider. Sinon, nous devinerions simplement quel est le problème que vous rencontrez.

10
Peter Lawrey

À moins que vous ne possédiez du code natif (code machine compilé pour une arcitechture spécifique), votre code fonctionnera aussi bien dans une JVM 32 bits que 64 bits.

Notez toutefois qu'en raison des adresses plus volumineuses (32 bits, 4 octets, 64 bits, 8 octets), une machine virtuelle Java 64 bits nécessite plus de mémoire qu'une machine virtuelle 32 bits pour la même tâche.

La différence 32 bits par rapport à 64 bits devient plus importante lorsque vous vous connectez à des bibliothèques natives. 64 bits Java ne sera pas en mesure de s’interfacer avec une DLL 32 bits non Java (via JNI)

3
John Thomas

Ajoutez un paramètre comme ci-dessous dans votre configuration lors de la création de l'exe

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

J'espère que ça aide.

merci...

/ jav

2
javangelo

Le JNI Java) requiert des bibliothèques de système d’exploitation ayant le même "caractère" que la machine virtuelle. Si vous essayez de construire quelque chose qui dépend, par exemple, de IESHIMS.DLL (vit dans% ProgramFiles%\Internet Explorer ) vous devez prendre la version 32 bits lorsque votre machine virtuelle Java est 32 bits, la version 64 bits lorsque votre machine virtuelle Java est 64 bits. De même pour les autres plates-formes.

En dehors de cela, vous devriez être prêt. Le généré Java bytecode s/b le même.

Notez que vous devez utiliser le compilateur 64bit Java pour les projets plus volumineux, car il peut traiter davantage de mémoire.

0
thecarpy