Comprensione dell’errore
Il lanciato OutfMemoryError non appare a causa della memoria heap insufficiente ma per i seguenti motivi:
Creazione thread eccessiva
Se l’applicazione crea troppi thread, potrebbe raggiungere un limite in cui non è possibile creare più thread. In tali casi, è fondamentale studiare la traccia dello stack lanciata con l’errore e ridurre il numero di creazioni del thread a livello di codice dell’applicazione.
Memoria nativa insufficiente
Questo problema sorge quando non è disponibile sufficiente memoria nativa per il processo Java per creare un thread. Il sistema operativo potrebbe avere una memoria inadeguata, che può portare a questo errore.
Vincoli delle risorse di sistema
Potrebbero esserci più processi in esecuzione e potrebbe aver raggiunto i thread massimi consentiti di essere creati sulla macchina su cui è in esecuzione l’applicazione.
Opzioni Java per risolvere il problema
Di seguito sono riportati i modi in Java attraverso i quali la memoria utilizzata dal processo Java può essere ridotta per dare più spazio alla memoria nativa per creare un thread:
- Ridurre la dimensione del mucchio. La riduzione della dimensione massima del heap ridurrà l’utilizzo della memoria del sistema operativo e consentirà al processo di utilizzarlo per le operazioni native, come la creazione di thread. Inoltre, l’impostazione di un valore di memoria basso per la dimensione minima del heap invece di impostare valori uguali per dimensioni minime e massime ridurrà lo spazio impegnato in memoria per l’heap, rendendolo disponibile per il processo da utilizzare per lo spazio nativo.
- Ridurre la dimensione dello stack del thread usando il parametro XSS. Ciò ridurrà la memoria assegnata a ciascun thread, che a sua volta consentirebbe la creazione di nuovi threads.s
- Ridurre il processo di Metaspace/qualsiasi altro spazio di memoria, che consentirebbe al processo più memoria nativa.
L’impostazione di cui sopra deve essere cambiata attentamente senza portare a un altro problema in queste aree.
Opzioni Linux per risolvere il problema
Ispezionando i processi esistenti
Sulla macchina Linux in cui il Errore OOM In un nuovo thread si verifica, controllare i vari processi e terminare quelli non necessari. Ridurre il numero di processi può aiutare a ridurre il conteggio complessivo dei thread sulla macchina.
Regolazione dei thread-max
Il parametro del kernel Linux thread-max imposta il numero massimo di thread per processo. Il valore corrente può essere visualizzato usando il comando seguente:
cat /proc/sys/kernel/threads-max
L’aumento del valore di questo parametro può consentire al processo di applicazione di creare più thread.
Regolazione di Ulimit -u
L’esecuzione del comando seguente può aiutare a verificare i processi massimi supportati per l’utente sulla macchina Linux:
L’aumento di questo valore a un valore più elevato aiuta anche indirettamente a creare più thread nel sistema. Questo valore può essere aumentato a un valore davvero alto o illimitato per aiutare a creare più thread nel sistema.
Gestire un uso elevato di memoria
Sistemi Linux Tenta di caricare tutte le pagine nella memoria disponibile e cacherle fino a quando la memoria libera non è bassa. Questo comportamento garantisce che le pagine necessarie siano caricate rapidamente dalla cache nella RAM anziché dal disco/swap, che sarà più lento.
Questo comportamento fa sì che la memoria libera scenda. Può essere confermato eseguendo il comando seguente, che mostrerà la memoria libera disponibile e la quantità di scambio viene utilizzata:
Se la memoria disponibile è bassa e la memoria di swap non viene utilizzata, indica che le pagine memorizzate nella cache non vengono ripulite dalla RAM. Può essere liberato manualmente o cancellando automaticamente le cache.
Cancella di cache manuale
I seguenti comandi possono essere eseguiti per ripulire le cache in RAM in modo che la memoria libera possa essere aumentata:
echo 1 > /proc/sys/vm/drop_caches
Questo comando cancella la cache della pagina.
echo 2 > /proc/sys/vm/drop_caches
Questo comando cancella le voci della listing e i dati dei file.
echo 3 > /proc/sys/vm/drop_caches
Questo comando cancella la cache di pagina, le voci della listing e i dati di file.
Monitorare la memoria libera dopo aver eseguito questi comandi e ripeterli periodicamente se la memoria libera diminuisce di nuovo.
Cancellatura della cache automatica
Se la memoria RAM non viene cancellata, ci sono alcuni parametri che possono essere utilizzati per cancellare la memoria RAM. Di seguito è riportato uno dei primi parametri da provare:
“/proc/sys/vm/swappiness”
Il parametro sopra controlla il modo in cui il kernel sposta i processi dalla RAM nell’space di scambio sul disco. Per impostazione predefinita, questo valore è 60 in SUSE Linux. Aumentarlo può aiutare a eliminare la RAM e spostare i contenuti per scambiare, mentre diminuisce ha l’effetto opposto. Monitorando l’utilizzo della memoria e dello scambio, questo parametro può essere messo a punto per raggiungere il giusto equilibrio. Spostare le cose dalla memoria della RAM creerà cose per passare allo scambio e il caricamento del contenuto in seguito dallo swap aumenterà il tempo di risposta.
Conclusione
L’outfmemoryerror lanciato durante la creazione di thread può essere risolto utilizzando le tecniche menzionate in questo weblog. Sia la regolazione dei parametri Java che i parametri Linux, a seconda dello state of affairs, aiuteranno a eliminare questo outofmemoryerror.