2012-09-10 24 views
8

Sto provando a eseguire una simulazione NetLogo (un framework di simulazione Java) su un cluster come parte di un esperimento di grandi dimensioni. Sono rimasto sorpreso dall'apparente richiesta di memoria di una (relativamente) semplice simulazione. Sul cluster lancia "ammassi java.lang.OutOfMemoryError: Java heap" per qualcosa di diverso da "-Xmx2500M" heapsizes. Una singola esecuzione richiede 5 ore per essere eseguita. Ho eseguito lo stesso esperimento su entrambi i miei Mac (iMac e MacBook Pro) e sono stati eseguiti in meno di un'ora, con "-Xmx1024" senza errori. I lavori del cluster richiedono "-XX: MaxPermSize = 250M" mentre sui miei Mac non è necessario aumentare di sopra del valore predefinito. Ho eseguito lo stesso codice, gli stessi input, usando sempre gli stessi giare in tutti i casi.Stesso programma, stessa JVM, ma requisiti di memoria e tempi di esecuzione molto diversi su macchine diverse - perché?

64 JVM bit vengono utilizzati in ogni singolo caso (e per quanto ne so questi sono piuttosto simili):

<on the cluster> 
$ java -version 
java version "1.6.0_26" 
Java(TM) SE Runtime Environment (build 1.6.0_26-b03) 
Java HotSpot(TM) 64-Bit Server VM (build 20.1-b02, mixed mode) 

<on my macs> 
$ java -version 
java version "1.6.0_31" 
Java(TM) SE Runtime Environment (build 1.6.0_31-b04-415-10M3646) 
Java HotSpot(TM) 64-Bit Server VM (build 20.6-b01-415, mixed mode) 

E io sono in esecuzione client JVM in tutti i casi (è stato inizialmente utilizzando Server in cluster, il passaggio al cliente non ha fatto differenza). Ho provato ad eseguire sul cluster con java 7, la stessa memoria enorme e problemi di tempo di esecuzione.

Sono completamente perplesso, nessuno con cui ho parlato può spiegare questo. Qualcuno là fuori si imbatte in questo prima? Qualsiasi aiuto molto apprezzato!

+0

Forse dovresti creare un dump dell'heap con -XX: + HeapDumpOnOutOfMemoryError e quindi usare MAT o simili per vedere cosa sta consumando la memoria. –

+0

Vorrei utilizzare VisualVM o un profiler di memoria commerciale come YourKit. –

+0

mi sembra che tu abbia anche due diverse versioni di jvm. Non dire che è il tuo problema, ma potrebbe contribuire. – Matt

risposta

3

Ho il sospetto che uno abbia un IO di rete o disco più veloce. Se si stanno utilizzando code per scrivere sul disco o scrivere sulla rete dove un computer può tenere il passo e l'altro no, la coda potrebbe rallentare la macchina e utilizzare una quantità illimitata di memoria.

Se si dispone di più veloce di rete IO è possibile aiutare inviare dati più veloce (mantenendo le code piccolo), o può significare si ricevono i dati troppo veloce (coda di significato può crescere più velocemente di quanto non vengono consumate)

molto dipende su ciò che effettivamente fa la tua applicazione. Quando il tuo programma ottiene un OOME, ti suggerisco di ottenere un dump dell'heap e di analizzarlo e cercare raccolte (ad esempio la coda) che consumano molta memoria.

+0

Grazie per la risposta molto veloce. La velocità dell'IO è stata uno dei primi suggerimenti. Il cluster è molto più lento e questo spiega l'inizializzazione molto più lenta delle mie macchine. Tuttavia il programma, una volta avviato, non legge/scrive su disco fino alla fine (5 ore dopo) e scrive una riga in un file quando lo fa. Dovrei anche dire che non c'è nessun altro che esegue qualcosa sul cluster durante questi test. Guarderò nella discarica, ma nel frattempo, qualche altro suggerimento? – user1660640

+0

Se si sta simulando un cluster, si ha un IO di rete, anche con loopback? I dati di velocità possono essere trasferiti su loopback e variano sensibilmente dal processore e dal sistema operativo. –

+0

L'intero lavoro (un singolo lavoro) viene eseguito su un singolo nodo del cluster: l'idea è di eseguire diverse centinaia di tali lavori contemporaneamente. Non c'è comunicazione tra i nodi richiesti, ogni lavoro è completamente autonomo come il proprio processo java. – user1660640

0

Ho il sospetto che il problema è che si sta utilizzando il server JVM. La JVM del client non è disponibile su macchine a 64 bit. Anche se chiedi la JVM del Cliente, ti darà quella Server.