2009-04-23 13 views
95

Il codice Java verrà compilato e compilato su un JDK a 32 bit in codice byte a 32 bit in una JVM a 64 bit? O una JVM a 64 bit richiede un codice byte a 64 bit?Compatibilità Java 32-bit vs 64-bit

Per fornire ulteriori dettagli, ho codice che funzionava in un ambiente Solaris con una JVM a 32 bit, ma ora ho problemi con l'aggiornamento di JDK e Weblogic Server a 64 bit.

+3

chiarire "problemi". –

+0

Sto riscontrando un problema simile: distribuzione di un'app di primavera sul server weblogic a 64 bit. Riceviamo varie eccezioni di classe non trovata e altri errori inutili. Inoltre, distribuisce ed esegue su alcune macchine a 64 bit, ma non su altre. Non possiamo tuttavia dire cosa è diverso. Hai risolto questo? – nont

+2

@nont - qualunque sia il problema, non è la compilazione 32vs64 bit. –

risposta

90

Sì, il bytecode Java (e il codice sorgente) è indipendente dalla piattaforma, presupponendo che si utilizzino librerie indipendenti dalla piattaforma. 32 vs 64 bit non dovrebbe avere importanza.

+0

Mi sono imbattuto in questo mentre cercavo una domanda che avevo. SO ho eseguito la mia applicazione con una JVM a 32 bit e utilizzato la libreria nativa a 64 bit. Funzionava bene. Ma quando eseguo la mia applicazione con una JVM a 64 bit e uso la libreria nativa a 32 bit, fallisce. Come potrebbe essere possibile? Solo curioso. –

+6

Le librerie native @umangdesai non sono librerie indipendenti dalla piattaforma, quindi l'ipotesi non è valida. –

+0

Does "should not matter" significa che il codice compilato con 'javac' a 32 bit sfrutterà la memoria resa disponibile con' java' a 64 bit? –

11

Sì alla prima domanda e no alla seconda domanda; è una macchina virtuale. I tuoi problemi sono probabilmente correlati a modifiche non specificate dell'implementazione della libreria tra le versioni. Anche se potrebbe essere, ad esempio, una condizione di gara.

Ci sono alcuni cerchi che la VM deve attraversare. In particolare i riferimenti sono trattati in file di classe come se occupassero lo stesso spazio di int s nello stack. double e long occupano due slot di riferimento. Per esempio campi, c'è qualche riarrangiamento che la VM di solito passa comunque. Tutto ciò è fatto (relativamente) in modo trasparente.

Anche alcune JVM a 64 bit usano "compresse oops". Poiché i dati sono allineati a circa 8 o 16 byte, tre o quattro bit dell'indirizzo sono inutili (sebbene un bit "mark" possa essere rubato per alcuni algoritmi). Ciò consente dati di indirizzo a 32 bit (quindi utilizzando metà della larghezza di banda, e quindi più veloce) per utilizzare dimensioni heap di 35 o 36 bit su una piattaforma a 64 bit.

+3

Mi sorprendi. Non pensavo che esistesse qualcosa come codice byte a 32 bit o codice byte a 64 bit. –

+3

Rileggendo la tua risposta - sei sicuro di non averlo fatto solo al contrario? (Sì allora no.) –

+0

+1 a Jon Skeet. Stavo scrivendo lo stesso commento ma sono stato chiamato via. –

20

Ho eseguito accidentalmente la nostra applicazione (di grandi dimensioni) su una macchina virtuale a 64 bit anziché su una macchina virtuale a 32 bit e non ho notato fino a quando alcune librerie esterne (chiamate da JNI) hanno iniziato a non funzionare.

I dati serializzati su una piattaforma a 32 bit sono stati letti sulla piattaforma a 64 bit senza alcun problema.

Che tipo di problemi ottieni? Alcune cose funzionano e non altre? Hai provato ad allegare JConsole ecc. E hai un picco in giro?

Se si dispone di una VM molto grande, è possibile che i problemi di GC a 64 bit possano influire sull'utente.

+1

stai dicendo che le librerie JNI non funzioneranno in una macchina virtuale a 64 bit se sono a 32 bit? –

+0

Non hanno fatto nel nostro. Ma è da un po 'che non l'ho provato. – Fortyrunner

+1

Non funzionano. Un collega aveva riferito di averlo fatto (che ho trovato sospetto - per non dire altro). Mi chiedevo se stesse correndo su Solaris e che ci fosse una sorta di thunk in corso. Non c'era; si sbagliava e correva sotto i 32 bit. – Fortyrunner

10

Tutto il codice byte è basato su 8 bit. (Ecco perché è chiamato codice BYTE) Tutte le istruzioni sono multiple di 8 bit. Sviluppiamo su macchine a 32 bit ed eseguiamo i nostri server con JVM a 64 bit.

Puoi fornire qualche dettaglio del problema che stai affrontando? Allora potremmo avere una possibilità di aiutarti. Altrimenti staremmo solo indovinando qual è il problema che stai avendo.

8

A meno che non si disponga di codice nativo (codice macchina compilato per un arcitechture specifico) il codice verrà eseguito ugualmente bene in una JVM a 32 e 64 bit.

Nota, tuttavia, a causa degli indirizzi più grandi (32 bit è 4 byte, 64 bit è 8 byte) una JVM a 64 bit richiederà più memoria di una JVM a 32 bit per la stessa attività.

+0

Si noti inoltre che una JVM a 32 bit su un sistema a 64 bit può avere più memoria disponibile di un 32- bit JVM su un sistema a 32 bit, quindi potrebbe essere un'opzione interessante se si dispone dell'applicazione "usa pochi GB di memoria". –

-5

yo dove sbagliato! A questo tema ho scritto una domanda a oracolo. La risposta era

"Se si compila il codice su una macchina a 32 bit, il codice deve essere eseguito solo su un processore a 32 bit. Se si desidera eseguire il codice su una JVM a 64 bit, è necessario compilare i file di classe su un 64 bit Macchina che utilizza un JDK a 64 bit. "

+5

Il [formato del codice byte] (http://java.sun.com/docs/books/jvms/second_edition/html/ClassFile.doc.html) Il codice Java viene in genere compilato per essere uguale indipendentemente dalle piattaforme a 32 bit o 64 bit. _Le regole sono diverse per qualsiasi codice nativo, ma il codice byte Java è portatile._ – McDowell

+4

Sì, sembra che chiunque in Oracle abbia risposto alla tua domanda lo abbia frainteso o non sapesse nulla della JVM. –

3

La differenza tra 32 e 64 bit diventa più importante quando ci si interfaccia con le librerie native. Java a 64 bit non sarà in grado di interfacciarsi con una dll non Java a 32 bit (tramite JNI)

+5

Non hai fornito nulla di nuovo a questa vecchia domanda. –

0

Java JNI richiede le librerie del sistema operativo con la stessa "bittiness" della JVM. Se si tenta di creare qualcosa che dipende, ad esempio, da IESHIMS.DLL (vive in% ProgramFiles% \ Internet Explorer) è necessario prendere la versione a 32 bit quando la JVM è a 32 bit, la versione a 64 bit quando la JVM è a 64 bit. Allo stesso modo per altre piattaforme.

A parte questo, dovresti essere tutto pronto. Il bytecode Java generato s/b lo stesso.

Si noti che è necessario utilizzare il compilatore Java a 64 bit per progetti di dimensioni maggiori in quanto può indirizzare più memoria.