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

97

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.

mshafrir
quelle
3
Bitte klären Sie "Probleme".
Thorbjørn Ravn Andersen
Ich habe ein ähnliches Problem - die Bereitstellung einer Spring-App auf einem 64-Bit-Weblogic-Server. Wir erhalten verschiedene Klassen nicht gefundene Ausnahmen und andere nicht hilfreiche Fehler. Darüber hinaus wird es auf einigen 64-Bit-Computern bereitgestellt und ausgeführt, auf anderen jedoch nicht. Wir können jedoch nicht sagen, was anders ist. Hast du das gelöst?
Nicht
2
@nont - was auch immer das Problem ist, es ist keine 32vs64-Bit-Kompilierung.
Stephen C

Antworten:

94

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

Zifre
quelle
Ich bin darauf gestoßen, als ich nach einer Frage gesucht habe, die ich hatte. Also habe ich meine Anwendung unter einer 32-Bit-JVM ausgeführt und eine native 64-Bit-Bibliothek verwendet. Es lief gut. Aber wenn ich meine Anwendung unter einer 64-Bit-JVM ausführe und eine native 32-Bit-Bibliothek verwende, schlägt dies fehl. Wie könnte das möglich sein? Nur neugierig.
Umang Desai
6
@umangdesai native Bibliotheken sind keine plattformunabhängigen Bibliotheken, daher gilt die Annahme nicht.
Thorbjørn Ravn Andersen
Bedeutet "sollte keine Rolle spielen", dass mit 32-Bit kompilierter Code javacden mit 64-Bit zur Verfügung gestellten Speicher nutzt java?
Marcus Junius Brutus
1
Wenn Sie davon betroffen sind, achten Sie auf native Bibliotheken, die in einem Glas gebündelt sind, das für eine Plattform funktioniert, aber nicht für die, die Ihnen Probleme bereitet. (Wenn Sie keine Ahnung haben, worauf ich mich beziehe, sehen Sie folgende Dinge: stackoverflow.com/a/14051512/155631 ).
Matt S.
21

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.

Fortyrunner
quelle
1
Wollen Sie damit sagen, dass JNI-Bibliotheken in einer 64-Bit-VM nicht funktionieren, wenn sie 32-Bit sind?
C. Ross
1
Sie funktionieren nicht. Ein Kollege hatte berichtet, dass dies der Fall war (was ich - gelinde gesagt - verdächtig fand). Ich fragte mich, ob er auf Solaris lief und dass es eine Art Thunking gab. Es gab nicht; Er hat sich geirrt und es lief unter 32bit.
Fortyrunner
Ich hatte ein ähnliches Problem mit einer JNI-Bibliothek. Es gab keine Kompatibilität zwischen den 32-Bit- und 64-Bit-Bibliotheken.
Erick Robertson
In der Tat müssen Ihre JNI-Bibliotheken ersetzt werden. Sie können die 64-Bit-Alternative wahrscheinlich einfach von der Website des Anbieters herunterladen. (Das war der Trick für mich, für alle JNI-Bibliotheken, die ich verwendet habe).
Bvdb
Dies waren interne Bibliotheken und es war kein 64-Bit-Äquivalent verfügbar, also war es an der Tagesordnung, auf 32 Bit zurückzugreifen.
Fortyrunner
11

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 ints auf dem Stapel. doubleund longbelegen 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.

Tom Hawtin - Tackline
quelle
3
Du überrascht mich. Ich hätte nicht gedacht, dass es so etwas wie 32-Bit-Bytecode oder 64-Bit-Bytecode gibt.
Jon Skeet
3
Lesen Sie Ihre Antwort noch einmal durch - sind Sie sicher, dass Sie es nicht nur umgekehrt gemeint haben? (Ja, dann nein.)
Jon Skeet
+1 an Jon Skeet. Ich schrieb den gleichen Kommentar, wurde aber abgerufen.
Michael Myers
Ich meinte dann ja ja, aber mit den Fragen umgekehrt. Habe eine Bearbeitung zurückgesetzt und bearbeitet (und ein bisschen mehr Informationen eingefügt).
Tom Hawtin - Tackline
4
@ Jon Skeet: Es gibt keinen 32-Bit- und 64-Bit-Bytecode, aber wenn JITed ist, sind die Zeiger in der JVM (normalerweise) 32 oder 64 Bit, abhängig von der Plattform. Und mit Compressed OOPS können sie an vielen Stellen 32-Bit-Zeiger verwenden, sogar auf 64-Bit-JVMs. Das spart viel Speicherplatz und erhöht die Codelokalität, was zu einer höheren Geschwindigkeit führt.
Joachim Sauer
9

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.

Peter Lawrey
quelle
8

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.

Thorbjørn Ravn Andersen
quelle
Beachten Sie auch, dass für eine 32-Bit-JVM auf einem 64-Bit-System möglicherweise mehr Speicher verfügbar ist als für eine 32-Bit-JVM auf einem 32-Bit-System. Daher ist dies möglicherweise eine interessante Option, wenn Sie einige GB Speicher verwenden "Anwendung.
Thorbjørn Ravn Andersen
3

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.

John Thomas
quelle
5
Sie haben dieser sehr alten Frage nichts Neues gegeben.
Austin Henley
0

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.

thecarpy
quelle
-5

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. "

elayer
quelle
5
Das Bytecode-Format, in das Java-Code normalerweise kompiliert wird, ist unabhängig von 32-Bit- oder 64-Bit-Plattformen dasselbe. Die Regeln sind für jeden nativen Code unterschiedlich, aber Java-Bytecode ist portabel.
McDowell
4
Ja, es sieht so aus, als hätte jemand bei Oracle Ihre Frage entweder falsch verstanden oder nichts über die JVM gewusst.
Paŭlo Ebermann