Le code Java construit et compilé sur un JDK 32 bits en code octet 32 bits fonctionnera-t-il dans une JVM 64 bits? Ou une JVM 64 bits nécessite-t-elle un code d'octet 64 bits?
Pour donner un peu plus de détails, j'ai du code qui fonctionnait dans un environnement Solaris exécutant une JVM 32 bits, mais je reçois maintenant des problèmes après la mise à niveau du serveur JDK et Weblogic vers 64 bits.
Réponses:
Oui, le bytecode Java (et le code source) est indépendant de la plate-forme, en supposant que vous utilisez des bibliothèques indépendantes de la plate-forme. 32 contre 64 bits ne devraient pas avoir d'importance.
la source
javac
profitera de la mémoire disponible avec 64 bitsjava
?J'ai accidentellement exécuté notre (grande) application sur une VM 64 bits plutôt qu'une VM 32 bits et je n'ai pas remarqué jusqu'à ce que certaines bibliothèques externes (appelées par JNI) aient commencé à é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 rencontrez-vous? Est-ce que certaines choses fonctionnent et pas d'autres? Avez-vous essayé de fixer JConsole, etc. et avez-vous un pic autour?
Si vous avez une très grosse machine virtuelle, vous constaterez peut-être que les problèmes de GC en 64 bits peuvent vous affecter.
la source
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, par exemple, une condition de course.
Il y a des obstacles que la VM doit franchir. Notamment, les références sont traitées dans les fichiers de classe comme si elles occupaient le même espace que
int
s sur la pile.double
etlong
occupez deux emplacements de référence. Par exemple, les champs, il y a de toute façon un réarrangement de la VM. Tout cela est fait (relativement) de manière transparente.Certaines JVM 64 bits utilisent également des "oops compressés". Parce que les données sont alignées à 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 rapide) d'utiliser des tailles de tas de 35 ou 36 bits sur une plate-forme 64 bits.
la source
Tout le code d'octet est basé sur 8 bits. (C'est pourquoi on l'appelle code BYTE) Toutes les instructions sont un multiple de 8 bits. Nous développons sur des machines 32 bits et exécutons nos serveurs avec une JVM 64 bits.
Pourriez-vous donner des détails sur le problème auquel vous êtes confronté? Ensuite, nous pourrions avoir une chance de vous aider. Sinon, nous devinerions simplement quel est le problème que vous rencontrez.
la source
Sauf si vous avez un code natif (code machine compilé pour une arcitechture spécifique), votre code fonctionnera aussi bien dans une JVM 32 bits et 64 bits.
Notez, cependant, qu'en raison des adresses plus grandes (32 bits correspond à 4 octets, 64 bits à 8 octets), une JVM 64 bits nécessitera plus de mémoire qu'une JVM 32 bits pour la même tâche.
la source
La différence 32 bits vs 64 bits devient plus importante lorsque vous vous connectez avec des bibliothèques natives. Java 64 bits ne pourra pas s'interfacer avec une dll non Java 32 bits (via JNI)
la source
Ajoutez un paramètre comme ci-dessous dans vous dans la 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 cela aide.
Merci...
/ jav
la source
Le Java JNI nécessite des bibliothèques OS de la même "bittiness" que la JVM. 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 JVM est 32 bits, la version 64 bits lorsque votre JVM est 64 bits. De même pour les autres plateformes.
En dehors de cela, vous devriez être prêt. Le bytecode Java généré s / b est le même.
Notez que vous devez utiliser le compilateur Java 64 bits pour les projets plus volumineux car il peut adresser plus de mémoire.
la source
yo où mal! Sur ce thème, j'ai écrit une question à oracle. La réponse était.
"Si vous compilez votre code sur une machine 32 bits, votre code ne doit s'exécuter que sur un processeur 32 bits. Si vous souhaitez exécuter votre code sur une machine JVM 64 bits, vous devez compiler vos fichiers de classe sur une machine 64 bits en utilisant un 64 bits -Bit JDK. "
la source