2009-12-02 5 views
8

Ich habe eine Java-App, die JarBundler verpackt ist. Die App ist ziemlich CPU-intensiv (viele große Collection.sort() -Aufrufe).64-Bit-Java-VM läuft App 10x langsamer

Unter Mac OS läuft die App langsam und träge, wenn der 64-Bit-JavaApplicationStub verwendet wird. Diese JavaApplicationStub-Datei startet die Java 64-Bit-VM.

Ich fand eine alte JavaApplicationStub-Datei, die nur 32-Bit ist. Ich ersetzte es im Bundle, und die App läuft 10x schneller! (Folglich wird die 32-Bit-VM verwendet, wenn die Anwendung ausgeführt wird).

Macht das Sinn? Warum ist die 64-Bit-VM so viel langsamer? Ist es sinnvoll, eine App zu erstellen und die JavaApplicationStub-Datei so zu hacken?

Beratung wird geschätzt.

+2

nur Ergebnisse erhalten Überprüfung, aber was ist die Hardware, die Sie auf laufen? –

+1

Vor allem, wie viel Speicher Sie haben. Bitte überprüfen Sie mit der Aktivitätsanzeige, ob der Computer getauscht wird. –

+0

läuft es auf MacBook Core 2 Duo 10.5.8 – craiglurey

Antwort

5

Siehe this post über die Vor- und Nachteile des Betriebs einer 64bit JVM. Zusammenfassend kann die Zeiger-Dereferenzierung & Speicher-De-Allocation länger dauern - und Sie bewegen sich um größere Datenstrukturen (d. H. 64, nicht 32 Bit, was Ihnen keinen Vorteil bietet, es sei denn, Sie verwenden sie explizit).

Siehe auch this relevant article, wo sie Rückgänge in der Leistung von bis zu 85% zu diskutieren, wenn auf 64-Bit-Bewegung, die mit in-line ist, was Sie erleben:

Der Grund für diese Abnahme der Leistung ist eigentlich sehr viel mit dem Anstieg der Speicher verbunden. Die Speicherreferenzen unter Java wurden doppelt so groß, wodurch die Größe von Speicherstrukturen in der WAS-Laufzeitumgebung und den Objekten Ihrer Anwendung erhöht wurde. Leider sind die Cache-Größen des Prozessorspeichers nicht gleichzeitig größer geworden. Dies bedeutet mehr Speichercache-Fehler, was bedeutet, dass die Hardware, die mit dem größeren Speicher arbeitet, arbeitsintensiver ist, was eine schlechtere Anwendungsleistung bedeutet.

+1

Also, wenn das Festhalten an 32-Bit die Antwort ist, was ist dann der beste Weg dies durchzusetzen? Soll JavaApplicationStub auf die 32-Bit-Version zurückgesetzt werden oder sollte es mit anderen VM-Parametern ausgeführt werden? – craiglurey

+0

Ich bin kein JavaApplicationStub/mac-Benutzer und konnte keine Dokumente dazu finden, aber auf dem Standard-Sun-jvm gibt es keine "64-Bit-jvm im 32-Bit-Modus ausführen" -Option, soweit ich das beurteilen kann (http: //java.sun.com/javase/technologies/hotspot/vmoptions.jsp#BehavioralOptions) verwende also einfach den 32 Bit Build, wenn du kannst. – Joel

-1

64 Bit ist nicht langsamer. Versuchen:

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 und 64 und uns sagen, was Sie

Verwandte Themen