2009-10-06 18 views
16

durante l'utilizzo di Jruby, ottengo questo messaggio.java.lang.OutOfMemoryError: Java heap space

Complete Java stackTrace 
java.lang.OutOfMemoryError: Java heap space 

come risolvere?

+0

Probabilmente si desidera allocare meno oggetti nell'heap. Puoi pubblicare uno snippet di codice in modo da poter capire quale codice stai cercando di eseguire? –

+0

possibile duplicato di [Come gestire l'errore "java.lang.OutOfMemoryError: Java heap space" (64 MB di heap size)] (http://stackoverflow.com/questions/37335/how-to-deal-with-java- lang-outofmemoryerror-java-heap-space-error-64mb-heap) – Mark

risposta

2

è possibile impostare il massimo heap a una dimensione più grande nella riga di comando:

java -Xmx512m MyClass 
1

o sei che perde la memoria e avete bisogno di trovare il motivo per cui o è necessario dare più spazio Java heap:

java -Xmx512m ... 
9

È possibile ottimizzare la dimensione heap JVM utilizzando le opzioni -Xmx e -Xms JVM: -Xmx per dimensione heap massima, e -Xms per dimensione iniziale heap. Es .:

java -Xms128m -Xmx256m BigApp 

Di solito utilizzo le stesse impostazioni per la dimensione iniziale e massima dell'heap.

Nel tuo caso, è davvero difficile dire come dimensionare la JVM senza ulteriori informazioni su cosa stai facendo, quando si verifica il problema ... O forse hai solo una perdita di memoria da qualche parte e aumentando la dimensione dell'heap vinta Aiuta, farà solo in modo che il problema si verifichi più tardi. In questo caso, l'unica soluzione è quella di riparare la perdita.

Ultimo non meno importante, tenere sempre a mente che più grande è l'heap, più lungo è il maggiore GC.

3

L'aumento della dimensione del dump dello heap potrebbe essere solo un cerotto. È necessario generare un heap dump aggiungendo l'argomento corretta corretta:

java -XX:+HeapDumpOnOutOfMemoryError -mn256m -mx512 

Questo genererà un file simile a Java _ * hprof.. È quindi possibile utilizzare uno stuolo di strumenti open source per analizzare il dump dell'heap. Java 1.6 viene fornito con JHat, che è un po 'buggato e non analizza bene gli heap di grandi dimensioni. Uso questo fantastico plugin Eclipse: Eclipse Memory Analyzer.

Una volta generato un report dal dump dell'heap, è possibile vedere quali classi occupano più memoria e si può usare come punto di partenza per eseguire il debug del codice per individuare eventuali perdite di memoria.

17

TLDR: jruby -J-Xmx1024m script_you_want_to_run.rb

Come altri hanno detto, il vostro programma sta tentando di allocare più memoria rispetto alla dimensione massima della JVM è permesso di allocare.

Come altri hanno già menzionato, è possibile configurare Java per consentire più allocazioni di memoria comunicandolo tramite la riga di comando con l'argomento -Xmx1024m (ad esempio).

-Xmx è l'argomento per la memoria massima e il 1024m corrisponde alla dimensione della memoria (l'ultimo m per i megabyte). Penso che JRuby avvii la JVM con la memoria massima impostata su 512m già, quindi probabilmente vorrai andare più in alto di così.

Per inviare gli argomenti alla JVM dalla riga di comando con JRuby, è necessario aggiungere -J davanti alla discussione, in modo dalla riga di comando sarà simile a questa:

jruby -J-Xmx1024m script_you_want_to_run.rb 

anche io d'accordo con i sentimenti di perdita di memoria: se non stai affrontando un sacco di oggetti con l'aspettativa che potresti vedere questo errore, allora potresti voler esaminare la possibilità che il tuo programma abbia effetti collaterali indesiderati.

1

Il messaggio "Spazio heap Java" indica che non è possibile allocare nuovi oggetti nell'heap di Java. L'errore non implica necessariamente perdita di memoria dell'applicazione. Il problema potrebbe essere semplice come un problema di configurazione, in cui la dimensione dell'heap specificata (o la dimensione predefinita, se non specificata) è insufficiente per l'applicazione.

potenziali fonti di questo errore e soluzioni: http://www.blogsoncloud.com/jsp/techSols/java-lang-OutOfMemoryError-Java-heap-space.jsp

4

controllare la versione JVM del JRuby con questo comando

jruby -v 

Se restituisce questa stringa significa che si sta utilizzando una JVM a 32 bit, pertanto si non si può impostare la dimensione heap massima per> = 2 GB

jruby 1.7.3 (1.9.3p385) 2013-02-21 dac429b on Java HotSpot(TM) Client VM 1.6.0_37-b06 [Windows 7-x86] 

È necessario impostare la JAVA_HOME per la versione a 64 bit di Java. per esempio.

set JAVA_HOME=C:\Program Files\Java\jdk1.7.0_09 

Si vedrà seguente output se si strofinano nuovo comando JRuby -v

jruby 1.7.3 (1.9.3p385) 2013-02-21 dac429b on Java HotSpot(TM) 64-Bit Server VM 1.7.0_09-b05 [Windows 7-amd64] 

Si può vedere che ora si sta utilizzando la versione a 64 bit di JVM. Dopo di che è possibile impostare sia JRuby opta parametro di ambiente nel modo seguente

set JRUBY_OPTS=-J-Xmx2g 

oppure è possibile eseguire il programma come segue

jruby -J-Xmx2g <your ruby program> 
+0

Avevo bisogno anche del flag '-S', ad esempio' jruby -J-Xmx2g -S rails s puma' – Kris

9

Impostazione JRUBY_OPTS è la soluzione che ha funzionato meglio per me. È stato menzionato nella risposta di Koray.

set JRUBY_OPTS=-J-Xmx2g 
0

ho incontrato un problema simile e non riesco a trovare una soluzione soddisfacente dopo googling per alcune ore. Se tutto ciò che serve è impostare i parametri Xms e Xmx, ecco cosa funziona per me:

ps aux | grep java

Scopri cosa è in esecuzione in realtà da jruby. Uccidilo (kill -9 process_id). Rieseguire il comando con le opzioni Java native sulla riga di comando.

Spero che aiuti.

A proposito, sto usando puma server con Jruby su Rails 4.0, e se qualcuno conosce una soluzione più elegante, per favore fatemelo sapere. Ho provato tutto (after_use_hook, .rvmrc, .bashrc, ecc. Ecc.)

Grazie.

+0

cosa intendi per 'nativo java opzione'? – Richardsondx

Problemi correlati