30 Novembre 2021
Expand search form

Perché Java usa così tanta memoria?

Anche se un server medio potrebbe avere 16 GB o più di memoria, l’uso eccessivo della memoria nelle applicazioni aziendali è diventato un problema sempre più frequente e critico. Da un lato, un alto grado di parallelismo e una mancanza di consapevolezza da parte dello sviluppatore possono portare rapidamente a carenze di memoria. Altre volte, ci può essere sufficiente memoria disponibile, ma con le JVM che usano gigabyte di memoria, le pause del GC possono essere inaccettabilmente lunghe.

Aumentare la memoria è l’ovvia soluzione per le perdite di memoria o per il software scritto male, ma fatto in modo sconsiderato questo può effettivamente peggiorare le cose a lungo termine. Dopo tutto, più memoria significa sospensioni più lunghe della raccolta della spazzatura.

Quelle che seguono sono le due cause più comuni per l’alto utilizzo di memoria in Java.

Uso scorretto della cache

Può sembrare controintuitivo, ma un uso eccessivo della cache può facilmente portare a problemi di prestazioni. Oltre ai problemi tipici, come le miss e l’elevato turnaround, una cache sovrautilizzata può esaurire rapidamente la memoria disponibile. Un corretto dimensionamento della cache può risolvere il problema, assumendo che si possa identificare la cache come causa principale. Il problema chiave delle cache sono i riferimenti morbidi, che hanno il vantaggio di poter essere rilasciati in qualsiasi momento a discrezione del garbage collector. È questa proprietà che li rende popolari nelle implementazioni della cache. Lo sviluppatore della cache presume, correttamente, che i dati della cache vengano rilasciati in caso di una potenziale carenza di memoria; in sostanza, per evitare un errore di out-of-memory (in contrasto con i riferimenti deboli, che non impediscono mai la garbage collection di un oggetto e non sarebbero utili in una cache).

Se configurata impropriamente, la cache crescerà fino a quando la memoria disponibile non sarà esaurita, il che farà sì che la JVM inneschi un GC, cancellando tutti i riferimenti deboli e rimuovendo i loro oggetti. L’uso della memoria torna al suo livello base, per poi ricominciare a crescere. I sintomi sono facilmente scambiati per una generazione giovane non correttamente configurata e spesso innescano un esercizio di tuning del GC.

Antipattern della cache di sessione

Quando una sessione HTTP viene usata impropriamente come una cache di dati, ci riferiamo ad essa come al session caching antipattern. Correttamente implementata, la sessione HTTP viene utilizzata per memorizzare i dati dell’utente o uno stato che deve sopravvivere oltre una singola richiesta HTTP. Questo stato di conversazione si trova nella maggior parte delle applicazioni web che hanno a che fare con interazioni utente non banali, ma ci sono potenziali problemi.

In primo luogo, quando un’applicazione ha molti utenti, un singolo server web può ritrovarsi con molte sessioni attive. Ovviamente, è importante che ogni sessione sia mantenuta piccola per evitare di consumare tutta la memoria disponibile. Secondo, queste sessioni non sono esplicitamente rilasciate dall’applicazione! Invece, i server web usano un timeout di sessione, che può essere impostato abbastanza alto per aumentare il comfort percepito dagli utenti. Questo può facilmente portare a grandi richieste di memoria e a sessioni HTTP che sono dell’ordine di diversi megabyte di dimensione.

Le cache di sessione sono convenienti perché è facile per gli sviluppatori aggiungere oggetti alla sessione senza considerare altre soluzioni che potrebbero essere più efficienti. Questo è spesso fatto in modalità fire-and-forget, il che significa che i dati non vengono mai rimossi. La sessione sarà comunque rimossa dopo che l’utente ha lasciato la pagina, o così potremmo pensare, quindi perché preoccuparsi? Quello che ignoriamo è che i timeout di sessione da 30 minuti a diverse ore non sono inauditi.

Una versione attualmente popolare di questo antipattern è l’uso improprio delle sessioni hibernate per gestire lo stato di conversazione. La sessione hibernate è memorizzata nella sessione HTTP per facilitare l’accesso rapido ai dati. Questo significa la memorizzazione di molto più stato del necessario, e con solo un paio di utenti, l’uso della memoria aumenta immediatamente in modo considerevole.

Se accoppiamo una grande sessione HTTP con la replica della sessione, otteniamo grandi alberi di oggetti che sono costosi da serializzare, e un sacco di dati da trasferire agli altri server web. Abbiamo appena aggiunto un grave problema di prestazioni in aggiunta al fatto che finiamo la memoria rapidamente.

Potresti anche essere interessato agli argomenti

Come posso ridurre l’uso della memoria di Java?

Riassunto – Cosa ha aiutato a ridurre l’uso della memoriaMantenere un’allocazione coerente della dimensione dell’heap. Rendere -Xms uguale a -Xmx.Ridurre la quantità di oggetti scartati (garbage) Per esempio, bufferizzare meno messaggi Kafka.Un po’ di GC fa molta strada.Apr 12, 2020

Perché Java è così affamato di memoria?

Java ha fatto scelte di compromesso che altre lingue non hanno fatto. Il tempo di caricamento è più lento della maggior parte degli altri linguaggi. La richiesta di memoria iniziale è più alta. Le stringhe, come sono più comunemente usate, consumano molta più memoria di quanto la maggior parte delle persone si renda conto.

Cosa causa un alto utilizzo della CPU in Java?

Le applicazioni Java possono richiedere elevate risorse di CPU per molte ragioni: Codice applicativo mal progettato con cicli inefficienti: Chiamate di metodi ricorsivi, uso inefficiente delle collezioni (ad esempio, ArrayLists troppo grandi invece di usare HashMaps) possono essere anche ragioni per questo.

Java consuma memoria?

La JVM usa la memoria in diversi modi. L’uso primario, ma non unico, della memoria è nell’heap. Al di fuori dell’heap, la memoria è consumata anche da Metaspace e dallo stack. Java Stack – Ogni thread ha il proprio stack di chiamate.

Come posso ridurre la dimensione dell’heap?

Preferibilmente l’heap dovrebbe essere almeno due volte la dimensione della quantità totale di oggetti live, o abbastanza grande in modo che la JVM spenda meno tempo nella raccolta della spazzatura dell’heap che nell’esecuzione del codice Java. Per permettere all’heap di crescere e ridursi a seconda della quantità di memoria libera nel vostro sistema, impostate -Xms più basso di -Xmx .

Cos’è la dimensione dell’heap di Java?

L’heap Java è l’area di memoria utilizzata per memorizzare gli oggetti istanziati dalle applicazioni in esecuzione sulla JVM. Gli oggetti nell’heap possono essere condivisi tra i thread. Molti utenti limitano la dimensione dell’heap Java a 2-8 GB per minimizzare le pause della garbage collection.

Quali sono le cause di un alto utilizzo della CPU?

Le cause di un alto utilizzo della CPU sono molto varie e in alcuni casi sorprendenti. Una velocità di elaborazione più lenta potrebbe facilmente essere il risultato del programma antivirus che stai eseguendo, o di un virus che il software è stato progettato per fermare.

Come si gestiscono i problemi di prestazioni in java?

Suggerimenti utili per la risoluzione dei problemi:Monitorare lo stato dei thread nella JVM e determinare il numero di thread in esecuzione, bloccati e in stato di deadlock.Utilizzare gli strumenti di monitoraggio delle prestazioni Java per aiutare a rilevare automaticamente i thread bloccati e i deadlock.Altri articoli…

Cosa succede se la memoria della JVM è piena?

Gli oggetti Java risiedono in un’area chiamata heap. L’heap viene creato all’avvio della JVM e può aumentare o diminuire di dimensione durante l’esecuzione dell’applicazione. Quando l’heap è pieno, viene raccolta la spazzatura. Durante la raccolta della spazzatura gli oggetti che non sono più utilizzati vengono cancellati, facendo così spazio per nuovi oggetti.

Che memoria usa Java?

Lo spazio heap in Java è utilizzato per l’allocazione dinamica della memoria per gli oggetti Java e le classi JRE in fase di esecuzione. I nuovi oggetti sono sempre creati nello spazio heap e i riferimenti a questi oggetti sono memorizzati nella memoria dello stack. Questi oggetti hanno un accesso globale e sono accessibili da qualsiasi punto dell’applicazione.

Perché la perdita di memoria avviene in Java?

In generale, una perdita di memoria Java si verifica quando un’applicazione mantiene involontariamente (a causa di errori logici nel codice) riferimenti a oggetti che non sono più necessari. Questi riferimenti ad oggetti non intenzionali impediscono al meccanismo di garbage collection integrato in Java di liberare la memoria consumata da questi oggetti.

Come faccio a sapere se la JVM è andata in crash?

Potete verificare se si è verificato un errore di out-of-virtual-memory nei seguenti modi: Guardate nel file di crash di testo. Il file di crash testuale . dump potrebbe indicare che le allocazioni di memoria sono fallite. … Controllare la dimensione del file binario di crash. Quando la JVM JRockit va in crash, genera un file binario di crash ( . core o .

Cos’è la dimensione massima dell’heap?

La dimensione massima dell’heap è la quantità di RAM allocata alla Java Virtual Machine (JVM) che esegue il monitoring Model Repository Service. Il valore predefinito è 1 GB. Puoi aumentare questa proprietà per aumentare le prestazioni del repository Model monitoring.

Come faccio a sapere la dimensione dell’heap?

Puoi verificare che la JVM stia usando lo spazio heap di Java aumentato:Apri una finestra di terminale.Inserisci il seguente comando: ps -ef | grep java | grep Xmx.Esamina l’output del comando.4 agosto 2021

Cosa succede se la memoria heap è piena?

Quando l’heap è pieno, viene raccolta la spazzatura. Durante la raccolta della spazzatura gli oggetti che non sono più utilizzati vengono cancellati, facendo così spazio per nuovi oggetti. Si noti che la JVM usa più memoria che il solo heap. … Quando il vecchio spazio diventa pieno, la spazzatura viene raccolta lì, un processo chiamato “old collection”.

Articolo precedente

Un esagono può essere concavo?

Articolo successivo

Come si chiama un gambo di mais?

You might be interested in …

Cos’è il resene?

Una delle più grandi aziende a conduzione familiare del paese, Resene compie quest’anno 70 anni. Resene è un’azienda pioniera e innovatrice, che produce vernici ecologiche e colori di moda in anticipo sui tempi. Il costruttore […]