wake-up-neo.com

Java 32-Bit vs 64-Bit-Kompatibilität

Funktioniert Java Code, der mit einem 32-Bit-JDK in 32-Bit-Byte-Code erstellt und kompiliert wurde, in einer 64-Bit-JVM? Oder erfordert eine 64-Bit-JVM 64-Bit-Byte-Code?

Um ein bisschen mehr Details zu geben, ich habe Code, der in einer Solaris-Umgebung mit einer 32-Bit-JVM lief, aber jetzt treten Probleme auf, nachdem ich das JDK und den Weblogic-Server auf 64-Bit aktualisiert habe.

96
mshafrir

Ja, Java Bytecode (und Quellcode) ist plattformunabhängig, vorausgesetzt, Sie verwenden plattformunabhängige Bibliotheken. 32- oder 64-Bit sollten keine Rolle spielen.

92
Zifre

Ich habe unsere (umfangreichere) Anwendung versehentlich auf einem 64-Bit-VM anstatt auf einem 32-Bit-VM ausgeführt und habe erst bemerkt, dass einige externe Bibliotheken (von JNI aufgerufen) fehlgeschlagen sind.

Auf einer 32-Bit-Plattform serialisierte Daten wurden problemlos auf der 64-Bit-Plattform eingelesen.

Welche Art von Problemen haben Sie? Funktionieren manche Dinge und andere nicht? Haben Sie versucht, JConsole usw. anzubringen, und haben Sie einen Spitzenwert?

Wenn Sie ein sehr großes VM haben, können Sie möglicherweise feststellen, dass GC-Probleme in 64-Bit Sie betreffen können.

20
Fortyrunner

Ja zur ersten Frage und nein zur zweiten Frage; Es ist eine virtuelle Maschine. Ihre Probleme hängen wahrscheinlich mit nicht angegebenen Änderungen in der Bibliotheksimplementierung zwischen den Versionen zusammen. Obwohl es sich zum Beispiel um eine Rennbedingung handeln könnte.

Es gibt einige Rahmen, die der VM durchlaufen muss. Insbesondere Referenzen werden in Klassendateien so behandelt, als ob sie denselben Platz wie ints auf dem Stapel belegen würden. double und long belegen zwei Referenzslots. Zum Beispiel gibt es in Feldern eine gewisse Umordnung, die normalerweise ohnehin von VM) durchgeführt wird. Dies geschieht alles (relativ) transparent.

Einige 64-Bit-JVMs verwenden auch "Compressed Oops". Da die Daten auf etwa alle 8 oder 16 Bytes ausgerichtet sind, sind drei oder vier Bits der Adresse unbrauchbar (obwohl bei einigen Algorithmen ein "Markierungs" -Bit gestohlen werden kann). Auf diese Weise können 32-Bit-Adressdaten (also mit halb so viel Bandbreite und damit schneller) auf einer 64-Bit-Plattform Heap-Größen von 35 oder 36 Bit verwenden.

11

Der gesamte Bytecode ist 8-Bit-basiert. (Deshalb heißt er BYTE-Code.) Alle Anweisungen sind ein Vielfaches von 8 Bit groß. Wir entwickeln auf 32-Bit-Computern und betreiben unsere Server mit 64-Bit-JVM.

Könnten Sie das Problem, mit dem Sie konfrontiert sind, im Detail erläutern? Dann haben wir vielleicht eine Chance, Ihnen zu helfen. Ansonsten würden wir nur raten, welches Problem Sie haben.

10
Peter Lawrey

Sofern Sie keinen systemeigenen Code haben (Computercode, der für eine bestimmte Architektur kompiliert wurde), funktioniert der Code in einer 32-Bit- und einer 64-Bit-JVM gleich gut.

Beachten Sie jedoch, dass aufgrund der größeren Adressen (32-Bit ist 4 Byte, 64-Bit ist 8 Byte) eine 64-Bit-JVM für dieselbe Task mehr Speicher benötigt als eine 32-Bit-JVM.

Der Unterschied zwischen 32-Bit und 64-Bit wird immer wichtiger, wenn Sie eine Schnittstelle zu nativen Bibliotheken herstellen. 64-Bit Java kann nicht mit einer 32-Bit-Nicht-Java-DLL (über JNI) verbunden werden.)

3
John Thomas

Fügen Sie beim Erstellen der Exe einen Parameter wie unten in der Konfiguration hinzu

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

Ich hoffe, es hilft.

vielen Dank...

/ jav

2
javangelo

Die Java JNI erfordert Betriebssystembibliotheken mit derselben "Bitterkeit" wie die JVM. Wenn Sie versuchen, etwas zu erstellen, das beispielsweise von IESHIMS.DLL abhängt (befindet sich in% ProgramFiles%\Internet Explorer) ) Sie müssen die 32-Bit-Version verwenden, wenn Ihre JVM 32-Bit ist, die 64-Bit-Version, wenn Ihre JVM 64-Bit ist. Ebenso für andere Plattformen.

Ansonsten solltest du bereit sein. Der generierte Java Bytecode s/b gleich.

Beachten Sie, dass Sie für größere Projekte den 64-Bit-Compiler Java) verwenden sollten, da er mehr Speicher adressieren kann.

0
thecarpy