2009-12-02 7 views
8

Ho un'app Java che è impacchettata usando JarBundler. L'app ha un consumo piuttosto elevato di CPU (molte chiamate Collection.sort()).Java VM a 64 bit esegue l'app 10 volte più lentamente

Su Mac OS, l'applicazione viene eseguita lentamente e lentamente quando si utilizza il JavaApplicationStub a 64 bit. Questo file JavaApplicationStub avvia la macchina virtuale a 64 bit Java.

Ho trovato un vecchio file JavaApplicationStub che è solo a 32 bit. L'ho sostituito nel pacchetto e l'app viene eseguita 10 volte più velocemente! (di conseguenza, la VM a 32 bit viene utilizzata quando viene eseguita l'applicazione).

Ha senso? Perché la macchina virtuale a 64 bit è molto più lenta? Ha senso costruire un'app e hackerare il file JavaApplicationStub in questo modo?

Il consiglio è apprezzato.

+2

Stavo solo controllando, ma qual è l'hardware è in esecuzione su? –

+1

Soprattutto quanta memoria hai. Si prega di verificare con visualizzatore di attività se la macchina si sta scambiando. –

+0

Esecuzione su MacBook Core 2 Duo 10.5.8 – craiglurey

risposta

5

Vedere this post sui vantaggi/svantaggi di eseguire una JVM a 64 bit. Nel riepilogo del dereferenziamento del puntatore, la disallocazione della memoria & può richiedere più tempo e si stanno spostando strutture di dati più grandi (ad esempio 64, non 32 bit, che non ti avvantaggiano a meno che tu non le usi esplicitamente).

vedere anche this relevant article, per discutere una diminuzione in termini di prestazioni fino al 85% quando si passa a 64 bit, che è in linea con quello che si sta verificando:

La ragione di questo calo di prestazioni è in realtà molto legato all'aumento della memoria. I riferimenti di memoria sotto le copertine di Java sono diventati il ​​doppio delle dimensioni, aumentando la dimensione delle strutture di memoria nel runtime di WAS e gli oggetti dell'applicazione. Sfortunatamente le dimensioni della cache della memoria del processore non aumentano allo stesso tempo. Ciò significa più errori nella cache di memoria, il che significa un lavoro più impegnativo per l'hardware che si occupa della memoria più grande, il che significa prestazioni peggiori delle applicazioni.

+1

Quindi se la risposta è 32-bit, qual è il modo migliore per far rispettare questo? JavaApplicationStub dovrebbe essere ripristinato sulla versione a 32 bit o dovrebbe essere eseguito con parametri VM diversi? – craiglurey

+0

Non sono un utente JavaApplicationStub/mac e non sono riuscito a trovare alcun documento relativo ad esso, ma sullo standard Sun jvm non esiste un'opzione "Esegui jav 64bit in modalità 32 bit" per quanto posso dire (http: //java.sun.com/javase/technologies/hotspot/vmoptions.jsp#BehavioralOptions) quindi usa la build a 32 bit, se puoi. – Joel

-1

64 bit non è più lento. Prova:

public class Benchmark { 
public static void main(String args[]) { 
long time = System.currentTimeMillis(); 
for (int a = 1; a < 900000000; a++) { 
    for (int b = 1; b < 20; b++) { 
    } 
} 
long time2 = System.currentTimeMillis() - time; 
System.out.println("\nTime counter stopped: " + time2); 

}

in 32 e 64 e dirci quali risultati si ottiene

Problemi correlati