Java.lang.OutOfMemoryError: spazio heap Java


Sto ricevendo il seguente errore sull'esecuzione di un programma multi-threading

java.lang.OutOfMemoryError: Java heap space

L'errore di cui sopra si è verificato in uno dei thread.

  1. Fino a mia conoscenza, lo spazio Heap è occupato solo da variabili di istanza. Se questo è corretto, allora perché questo errore si è verificato dopo aver eseguito bene per qualche tempo come spazio per esempio le variabili sono assegnate al momento della creazione dell'oggetto.

  2. C'è un modo per aumentare lo spazio heap?

  3. Cosa cambia dovrei fare al mio programma in modo che possa afferrare meno spazio heap?

Author: Ravindra babu, 2009-10-20

10 answers

Se si desidera aumentare lo spazio heap, è possibile utilizzare java -Xms<initial heap size> -Xmx<maximum heap size> sulla riga di comando. Per impostazione predefinita, i valori sono basati sulla versione JRE e sulla configurazione del sistema. È possibile trovare ulteriori informazioni sulle opzioni VM sul sito web Java.

Tuttavia, consiglierei di profilare la tua applicazione per scoprire perché la tua dimensione dell'heap viene mangiata. NetBeans ha un molto buono profiler incluso con esso. Credo che usi il jvisualvm sotto il cofano. Con un profiler, puoi provare a trova dove vengono creati molti oggetti, quando gli oggetti vengono raccolti e altro ancora.

 97
Author: Thomas Owens, 2016-05-21 12:18:12

1.- Sì, ma si riferisce praticamente all'intera memoria utilizzata dal tuo programma.

2.- Sì vedere Opzioni Java VM

-Xms<size>        set initial Java heap size
-Xmx<size>        set maximum Java heap size

Ie

java -Xmx2g assegna 2 gigabyte di ram come massimo alla tua app

Ma dovresti prima vedere se non hai una perdita di memoria.

3.- Dipende dal programma. Prova perdite di memoria spot. Questa domanda sarebbe difficile da rispondere. Ultimamente puoi profilare usando JConsole per cercare di scoprire dove sta andando la tua memoria

 25
Author: OscarRyz, 2009-10-20 17:27:06

Potresti voler guardare questo sito per saperne di più sulla memoria nella JVM: http://developer.streamezzo.com/content/learn/articles/optimization-heap-memory-usage

Ho trovato utile usare visualgc per vedere come si stanno riempiendo le diverse parti del modello di memoria, per determinare cosa cambiare.

È difficile determinare quale parte della memoria è stata riempita, quindi visualgc, poiché potresti voler semplicemente cambiare la parte che sta avendo un problema, piuttosto che dire,

Va bene! Darò 1G di RAM alla JVM.

Cerca di essere più preciso su ciò che stai facendo, a lungo termine probabilmente troverai il programma migliore per questo.

Per determinare dove potrebbe essere la perdita di memoria è possibile utilizzare i test unitari per questo, testando quale fosse la memoria prima del test e dopo, e se c'è un cambiamento troppo grande, potresti volerlo esaminare, ma devi fare il controllo mentre il test è ancora in esecuzione.

 8
Author: James Black, 2013-06-19 07:50:32

Per aumentare la dimensione dell'heap è possibile utilizzare l'argomento-Xmx quando si avvia Java; ad esempio

-Xmx256M
 6
Author: Adamski, 2013-06-19 07:47:07

È possibile ottenere la dimensione della memoria heap attraverso sotto programe.

public class GetHeapSize {
    public static void main(String[] args) {
        long heapsize = Runtime.getRuntime().totalMemory();
        System.out.println("heapsize is :: " + heapsize);
    }
} 

Quindi di conseguenza puoi aumentare la dimensione dell'heap anche usando: java-Xmx2g http://www.oracle.com/technetwork/java/javase/tech/vmoptions-jsp-140102.html

 6
Author: user2663609, 2015-11-20 08:54:35
  1. Nella maggior parte dei casi, il codice non è ottimizzato. Rilascia quegli oggetti che pensi non saranno necessari ulteriormente. Evita ogni volta la creazione di oggetti nel tuo ciclo. Prova ad usare le cache. Non capisco come sta andando la tua candidatura. Ma nella programmazione, si applica anche una regola di vita normale

    Prevenire è meglio che curare. "Non creare oggetti non necessari"

 5
Author: DKSRathore, 2009-10-22 17:28:39
  1. Fino a mia conoscenza, lo spazio Heap è occupato solo da variabili di istanza. Se questo è corretto, allora perché questo errore si è verificato dopo aver eseguito bene per qualche tempo come spazio per esempio le variabili sono assegnate al momento della creazione dell'oggetto.

Ciò significa che stai creando più oggetti nell'applicazione per un periodo di tempo continuo. I nuovi oggetti verranno memorizzati nella memoria heap e questo è il motivo della crescita nella memoria heap.

Heap non contiene solo variabili di istanza. Memorizzerà tutti i tipi di dati non primitivi ( Oggetti). Il tempo di vita di questi oggetti può essere breve (blocco del metodo) o lungo (fino a quando l'oggetto non viene referenziato nell'applicazione)

  1. C'è un modo per aumentare lo spazio heap?

Sì. Dai un'occhiata a questo oracle articolo per maggiori dettagli.

Ci sono due parametri per impostare la dimensione dell'heap:

-MSM:, che imposta l'heap iniziale e minimo dimensione

-Xmx:, che imposta la dimensione massima dell'heap

  1. Quali modifiche dovrei apportare al mio programma in modo che catturi meno spazio heap?

Dipende dalla tua applicazione.

  1. Impostare la memoria heap massima secondo il requisito dell'applicazione

  2. Non causare perdite di memoria nell'applicazione

  3. Se si riscontrano perdite di memoria nell'applicazione, trovare la causa principale con l'aiuto di strumenti di profilazione come MAT, VM visiva , jconsole ecc. Una volta trovata la causa principale, correggere le perdite.

Note importanti da oracle articolo

Causa: Il messaggio di dettaglio Java heap space indica che l'oggetto non può essere allocato nell'heap Java. Questo errore non implica necessariamente una perdita di memoria.

Possibili ragioni:

  1. Configurazione errata (non allocazione sufficiente memoria)
  2. L'applicazione contiene involontariamente riferimenti agli oggetti e ciò impedisce che gli oggetti vengano raccolti in modo spazzatura
  3. Applicazioni che fanno un uso eccessivo di finalizzatori. Se una classe ha un metodo finalize, gli oggetti di quel tipo non hanno il loro spazio recuperato al momento della garbage collection. Se il thread finalizzatore non riesce a tenere il passo, con la coda di finalizzazione, l'heap Java potrebbe riempirsi e questo tipo di eccezione OutOfMemoryError verrebbe generata.

Su una nota diversa, utilizzare algoritmi di Garbage collection migliori ( CMS o G1GC)

Dai un'occhiata a questa domanda per capire G1GC

 5
Author: Ravindra babu, 2017-05-23 12:26:17
  1. Le variabili locali si trovano nello stack. Lo spazio Heap è occupato da oggetti.

  2. È possibile utilizzare l'opzione -Xmx.

  3. Fondamentalmente lo spazio heap viene utilizzato ogni volta che si assegna un nuovo oggetto con new e liberato qualche tempo dopo che l'oggetto non è più referenziato. Quindi assicurati di non tenere riferimenti a oggetti che non ti servono più.

 3
Author: sepp2k, 2009-10-20 17:09:29

No, penso che tu stia pensando allo spazio dello stack. Lo spazio Heap è occupato da oggetti. Il modo per aumentarlo è-Xmx256m, sostituendo il 256 con l'importo necessario sulla riga di comando.

 1
Author: Yishai, 2009-10-20 17:07:50

In netbeans, Vai alla barra degli strumenti 'Esegui',- > 'Imposta configurazione progetto'- > 'Personalizza' - > 'esegui' del suo windo spuntato - > 'Opzione VM' - > compila '- Xms2048m-Xmx2048m'. Potrebbe risolvere il problema delle dimensioni dell'heap.

 0
Author: Xiaogang, 2017-06-12 22:49:25