Funktioniert Java-Code, der für ein 32-Bit-JDK in 32-Bit-Byte-Code erstellt und kompiliert wurde, in einer 64-Bit-JVM? Oder benötigt eine 64-Bit-JVM 64-Bit-Bytecode?
Um ein wenig mehr Details zu geben, ich habe Code, der in einer Solaris-Umgebung mit einer 32-Bit-JVM funktioniert hat, aber jetzt treten Probleme auf, nachdem ich das JDK und den Weblogic-Server auf 64-Bit aktualisiert habe.
Antworten:
Ja, Java-Bytecode (und Quellcode) ist plattformunabhängig, vorausgesetzt, Sie verwenden plattformunabhängige Bibliotheken. 32 vs. 64 Bit sollten keine Rolle spielen.
quelle
javac
den mit 64-Bit zur Verfügung gestellten Speicher nutztjava
?Ich habe versehentlich unsere (größere) Anwendung auf einer 64-Bit-VM anstatt auf einer 32-Bit-VM ausgeführt und erst bemerkt, als einige externe Bibliotheken (von JNI aufgerufen) ausfielen.
Auf einer 32-Bit-Plattform serialisierte Daten wurden ohne Probleme auf der 64-Bit-Plattform eingelesen.
Welche Probleme bekommen Sie? Funktionieren einige Dinge und andere nicht? Haben Sie versucht, JConsole usw. anzubringen, und haben Sie einen Höhepunkt?
Wenn Sie eine sehr große VM haben, können GC-Probleme in 64-Bit Sie betreffen.
quelle
Ja zur ersten Frage und Nein zur zweiten Frage; Es ist eine virtuelle Maschine. Ihre Probleme hängen wahrscheinlich mit nicht spezifizierten Änderungen in der Bibliotheksimplementierung zwischen den Versionen zusammen. Obwohl es zum Beispiel eine Rennbedingung sein könnte.
Es gibt einige Rahmen, die die VM durchlaufen muss. Insbesondere werden Referenzen in Klassendateien so behandelt, als hätten sie denselben Speicherplatz wie
int
s auf dem Stapel.double
undlong
belegen zwei Referenzsteckplätze. Zum Beispiel gibt es Felder, in denen die VM normalerweise sowieso neu angeordnet wird. Dies geschieht alles (relativ) transparent.Auch einige 64-Bit-JVMs verwenden "Compressed Oops". Da die Daten etwa alle 8 oder 16 Bytes ausgerichtet sind, sind drei oder vier Bits der Adresse unbrauchbar (obwohl für einige Algorithmen möglicherweise ein "Mark" -Bit gestohlen wird). Auf diese Weise können 32-Bit-Adressdaten (daher mit halb so viel Bandbreite und daher schneller) Heap-Größen von 35 oder 36 Bit auf einer 64-Bit-Plattform verwenden.
quelle
Der gesamte Bytecode basiert auf 8 Bit. (Deshalb heißt es BYTE-Code.) Alle Anweisungen sind ein Vielfaches von 8 Bit. Wir entwickeln auf 32-Bit-Computern und betreiben unsere Server mit 64-Bit-JVM.
Können Sie das Problem, mit dem Sie konfrontiert sind, näher erläutern? Dann haben wir vielleicht die Chance, Ihnen zu helfen. Andernfalls würden wir nur raten, was das Problem ist, das Sie haben.
quelle
Sofern Sie keinen nativen Code haben (Maschinencode, der für eine bestimmte Arcitechture kompiliert wurde), läuft Ihr Code in einer 32-Bit- und einer 64-Bit-JVM gleich gut.
Beachten Sie jedoch, dass eine 64-Bit-JVM aufgrund der größeren Adressen (32-Bit ist 4 Byte, 64-Bit ist 8 Byte) mehr Speicher benötigt als eine 32-Bit-JVM für dieselbe Aufgabe.
quelle
Der Unterschied zwischen 32-Bit und 64-Bit wird 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.
quelle
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
quelle
Die Java-JNI erfordert Betriebssystembibliotheken mit der gleichen "Bittiness" wie die JVM. Wenn Sie versuchen, etwas zu erstellen, das beispielsweise von IESHIMS.DLL abhängt (befindet sich in% ProgramFiles% \ Internet Explorer), müssen Sie 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.
Abgesehen davon sollten Sie bereit sein. Der generierte Java-Bytecode ist s / b gleich.
Beachten Sie, dass Sie den 64-Bit-Java-Compiler für größere Projekte verwenden sollten, da er mehr Speicher adressieren kann.
quelle
yo wo falsch! Zu diesem Thema habe ich eine Frage an Orakel geschrieben. Die Antwort war.
"Wenn Sie Ihren Code auf einem 32-Bit-Computer kompilieren, sollte Ihr Code nur auf einem 32-Bit-Prozessor ausgeführt werden. Wenn Sie Ihren Code auf einer 64-Bit-JVM ausführen möchten, müssen Sie Ihre Klassendateien auf einem 64-Bit-Computer mit einem 64-Bit-Computer kompilieren -Bit JDK. "
quelle