Gleiches Programm, gleiche JVM, aber sehr unterschiedliche Speicheranforderungen und Ausführungszeiten auf verschiedenen Rechnern - warum?

8

Ich versuche, eine NetLogo -Simulation (ein Java Simulation Framework) auf einem Cluster als Teil eines großen Experiments auszuführen . Ich war überrascht über den scheinbar massiven Speicherbedarf einer (relativ) einfachen Simulation. Auf dem Cluster werden die Ausnahmen "java.lang.OutOfMemoryError: Java heap space" für weniger als "-Xmx2500M" hoepsizes ausgelöst. Eine einzelne Ausführung dauert 5 Stunden. Ich habe das gleiche Experiment auf beiden Macs (iMac und MacBook Pro) ausgeführt, und sie wurden in weniger als einer Stunde ausgeführt, wobei "-Xmx1024" keine Fehler verursachte. Die Cluster-Jobs benötigen "-XX: MaxPermSize = 250M", während auf meinen Macs keine Erhöhung über den Standardwert hinaus erforderlich ist. Ich habe den gleichen Code, die gleichen Eingaben, unter Verwendung der genau gleichen Gläser in allen Fällen.

64-Bit-JVMs werden in jedem Fall verwendet (und soweit ich weiß, sind diese ziemlich ähnlich):

%Vor%

Und ich benutze Client JVM in allen Fällen (war ursprünglich Server auf Cluster, Wechsel zum Client machte keinen Unterschied). Ich habe versucht, auf dem Cluster mit Java 7, gleichen großen Speicher und Ausführungszeit Probleme.

Ich bin völlig perplex, niemand, mit dem ich gesprochen habe, kann das erklären. Ist jemand da draußen schon einmal da? Jede Hilfe sehr geschätzt!

    
user1660640 10.09.2012, 16:17
quelle

2 Antworten

3

Ich vermute, dass man eine schnellere Netzwerk- oder Festplatten-IO hat. Wenn Sie Warteschlangen verwenden, um auf den Datenträger zu schreiben oder in das Netzwerk zu schreiben, in dem ein Computer mithalten kann und der andere nicht, kann die Warteschlange den Rechner verlangsamen und eine unbegrenzte Menge an Arbeitsspeicher verwenden.

Wenn Sie eine schnellere Netzwerk-E / A haben, können Sie Daten entweder schneller senden (Warteschlangen klein halten) oder Daten zu schnell empfangen (dh, die Warteschlange kann schneller wachsen als sie verbraucht wird)

Es hängt viel davon ab, was Ihre Anwendung tatsächlich tut. Wenn Ihr Programm ein OOME erhält, schlage ich vor, dass Sie einen Heapspeicherauszug erstellen und ihn analysieren und nach Datensätzen (z. B. Warteschlange) suchen, die viel Speicher belegen.

    
Peter Lawrey 10.09.2012 16:22
quelle
0

Ich vermute, dass das Problem darin besteht, dass Sie die Server-JVM verwenden. Die Client-JVM ist auf 64-Bit-Computern nicht verfügbar. Selbst wenn Sie nach dem Client JVM fragen, wird Ihnen der Server einen geben.

    
Eric Pabst 19.09.2013 12:55
quelle