JavaRush /Java Blog /Random-IT /Come sono correlati i contenitori e Java?
Павел
Livello 11

Come sono correlati i contenitori e Java?

Pubblicato nel gruppo Random-IT
Per coloro che hanno letto di container e Docker , ma non capiscono come Java si sia agganciato ai container. Innanzitutto, rinfreschiamo la memoria sulla memoria Java . Ti ricordo che la memoria è composta da Stack e Heap, che utilizzano la RAM (random access memory) del server; quando parleremo ulteriormente di memoria, intendiamo RAM. Ora diamo un'occhiata al contenitore in sezione trasversale. Come sono correlati i contenitori e Java?  -1 No, certo che no, non ci interessano la groppa e le cosce, guarderemo la struttura della memoria nel contenitore. Può essere diviso in tre parti: • Memoria Heap – l'heap stesso; • Off Heap è tutto ciò che non è nell'heap; • Il sovraccarico del sistema operativo è il sovraccarico della memoria per l'implementazione dei processi all'interno del contenitore. Come sono correlati i contenitori e Java?  - 2 Diciamo: abbiamo assegnato 1 Gb al contenitore, nella figura sarà Container Limit : i suoi confini sono indicati da un rettangolo blu. Abbiamo assegnato l'80%, ovvero 0,8 Gb, per la memoria Java nel contenitore e Heap ci ha impiegato circa l'80% del contenitore, ovvero non molto meno di 0,8 Gb, perché il sovraccarico del sistema operativo ha preso parte delle risorse (overhead) per il mantenimento dei processi. Circa il 20% del contenitore viene lasciato per tutto ciò che non è connesso all'heap ( Off Heap ). L' area Utilizzata nella figura mostra l'area di memoria utilizzata per l'esecuzione dell'applicazione. Ora dobbiamo parlare di situazioni in cui la memoria nel contenitore potrebbe esaurirsi. OutOfMemoryError Se il consumo di memoria dell'applicazione ( Used area ) raggiunge i limiti dell'heap ( Heap ), verrà rilevato un OutOfMemoryError (OOM Error) . Ciò significa che non c'è abbastanza spazio nell'heap, vale a dire nell'area di memoria in cui vengono posizionati gli oggetti creati a livello di programmazione nell'applicazione. Come sono correlati i contenitori e Java?  - 3 Se non è ancora del tutto chiaro, lo spiegherò nei gatti. L'errore OOM è quando un gatto urla per molto, molto tempo davanti alle porte del balcone, e quando questa porta viene aperta, rimane sulla soglia e non va da nessuna parte, spesso dicono che il gatto è congelato. Se lo spingi in tempo, lascerà cadere la mascella e andrà sul balcone a fare i suoi bisogni da gattino. Come sono correlati i contenitori e Java?  - 4 OOM Killer Questa è un'altra situazione che può verificarsi in un contenitore quando la memoria si esaurisce.Se Come sono correlati i contenitori e Java?  - 5 un programma esce dal contenitore, otteniamo un OutOfMemory Killer (OOM Killer) - questo è un processo che termina l'applicazione per salvare il kernel dal crash. Sacrifica l'applicazione per mantenere il contenitore in esecuzione. Non è un dato di fatto che il contenitore cadrà, ma l'applicazione in esso eseguita cadrà sicuramente. Ciò accade se si lascia incontrollato il consumo di memoria di un'applicazione Java. Ancora una volta sui gatti. Se hai deciso di dormire più a lungo sabato e hai dimenticato di dare il cibo ai gatti, allora OOM Killeri fiori sono garantiti, i vasi non potranno essere danneggiati, ma i fiori dovranno essere ripiantati. Come sono correlati i contenitori e Java?  - 6 Qual è la differenza tra OOM Error e OOM Killer? Puoi elaborare OOM Error ed eseguire alcune azioni (ad esempio: ridimensionare l'applicazione) e OOM Killer ucciderà semplicemente l'intero processo. OOM Killer è simile a kill-9 (kill meno nove) - un comando che uccide un processo in Linux . Come sono correlati i contenitori e Java?  -7 Il fatto è che l'implementazione del contenitore più popolare è il contenitore Docker, che è basato su Linux , anche se lo esegui sotto Windows , il kernel sarà comunque di Linux . In Linux, siamo interessati a un concetto: CGroups (gruppo di controllo inglese) - un meccanismo del kernel Linux che limita e isola le risorse di calcolo (processore, rete, risorse di memoria, risorse I/O) per gruppi di processi. In parole povere, questo meccanismo consente di gestire le risorse in un contenitore, nel nostro caso la memoria. Come si relaziona Java a questo? È attraverso il meccanismo CGroups che Java può agganciarsi alla memoria del contenitore. Ma tutto dipende dalla versione di Java. Ad esempio, Java 7 non sa come utilizzare CGroups e i limiti del contenitore gli sono sconosciuti. Per impostazione predefinita, la dimensione heap massima = ¼ di memoria fisica. Se l'applicazione supera i limiti del contenitore, ci sarà un OOM Killer e se i limiti del contenitore non sono impostati, l'applicazione prenderà memoria da altre applicazioni sul server (è meglio impostare dei limiti, altrimenti tutti perderanno) . Ovviamente puoi utilizzare le impostazioni dell'heap o utilizzare "immagini" speciali che risolvono questo problema, ma il modo più semplice è utilizzare la versione corretta di Java. Le versioni corrette iniziano con Java 8 x131 (portato da Java 9), inizia a comprendere CGroups . E in Java 10 è apparso il supporto per i contenitori: UseContainerSupport , successivamente questa funzione è stata trasferita su Java 8 x 191 . Oppure puoi semplicemente usare Java: 11+ . Cosa si può concludere: Quando si utilizza la memoria contenitore, è possibile che venga visualizzato un messaggio OutOfMemoryError (errore OOM) o OutOfMemoryKiller (OOM Killer). Nel primo caso, l'applicazione non si bloccherà immediatamente, sarà possibile rilevare l'errore OOM, elaborarlo e intraprendere azioni controllate. Ad esempio, ridimensionare l'applicazione. Se si verifica un OOM Killer, l'applicazione si bloccherà immediatamente e non ci saranno più opzioni per salvarla. E la cosa peggiore è che esternamente il contenitore stesso andrà bene, cioè potresti non sospettare nemmeno che sia caduto qualcosa lì. I meccanismi Linux vengono utilizzati per interagire con il contenitore e la memoria Java. Ma non tutti i Java li implementano. Per evitare problemi con Java 8, è necessario utilizzare una versione a partire dalla 131, o meglio ancora, dalla 191. Oppure utilizzare Java: 11+. Per esercitazione: OutOfMemoryError: catturalo se puoi
Commenti
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION