JavaRush /Java-Blog /Random-DE /Wie hängen Container und Java zusammen?
Павел
Level 11

Wie hängen Container und Java zusammen?

Veröffentlicht in der Gruppe Random-DE
Für diejenigen, die über Container und Docker gelesen haben , aber nicht verstehen, wie sich Java an Container gebunden hat. Lassen Sie uns zunächst unsere Erinnerung an den Java-Speicher auffrischen . Ich möchte Sie daran erinnern, dass der Speicher aus Stack und Heap besteht, die den RAM (Random Access Memory) des Servers nutzen; wenn wir weiter über Speicher sprechen, meinen wir RAM. Schauen wir uns nun den Behälter im Querschnitt an. Wie hängen Container und Java zusammen?  - 1 Nein, natürlich nicht, der Rumpf und die Oberschenkel interessieren uns nicht, wir schauen uns die Gedächtnisstruktur im Container an. Es kann in drei Teile unterteilt werden: • Heap-Speicher – der Heap selbst; • Off Heap ist alles, was sich nicht im Heap befindet; • OS-Overhead ist der Speicher-Overhead für die Implementierung von Prozessen innerhalb des Containers. Wie hängen Container und Java zusammen?  - 2 Nehmen wir an: Wir haben dem Container 1 GB zugewiesen, in der Abbildung ist es Container Limit – seine Grenzen werden durch ein blaues Rechteck angezeigt. Wir haben 80 %, also 0,8 GB, für den Java-Speicher im Container reserviert, und Heap hat uns etwa 80 % des Containers, also nicht viel weniger als 0,8 GB, in Anspruch genommen, da der OS-Overhead einen Teil der Ressourcen (Overhead) beanspruchte. zur Aufrechterhaltung von Prozessen. Etwa 20 % des Containers bleiben für alles übrig, was nicht mit dem Heap ( Off Heap ) verbunden ist. Der verwendete Bereich in der Abbildung zeigt den verwendeten Speicherbereich zum Ausführen der Anwendung. Jetzt müssen wir über Situationen sprechen, in denen der Speicher im Container möglicherweise knapp wird. OutOfMemoryError Wenn der Speicherverbrauch der Anwendung ( Verwendeter Bereich ) die Heap-Grenzen ( Heap ) erreicht, wird ein OutOfMemoryError (OOM-Fehler) abgefangen . Das heißt, dass im Heap, also im Speicherbereich, in dem programmgesteuert in der Anwendung erstellte Objekte abgelegt werden, nicht genügend Platz vorhanden ist. Wie hängen Container und Java zusammen?  - 3 Wenn es noch nicht ganz klar ist, erkläre ich es bei Katzen. OOM-Fehler liegt vor, wenn eine Katze lange, lange vor der Balkontür schreit, und wenn diese Tür geöffnet wird, sie in der Tür steht und nicht in die eine oder andere Richtung geht, heißt es oft, die Katze sei gefroren. Wenn Sie ihn rechtzeitig drängen, wird er die Kinnlade herunterklappen und auf den Balkon gehen, um sein Katzengeschäft zu erledigen. Wie hängen Container und Java zusammen?  - 4 OOM-Killer Dies ist eine weitere Situation, die in einem Container auftreten kann, wenn der Speicher knapp wird. Wie hängen Container und Java zusammen?  - 5 Wenn ein Programm den Container verlässt, kommt es zu einem OutOfMemory-Killer (OOM-Killer) – das ist ein Prozess, der die Anwendung beendet, um einen Absturz des Kernels zu verhindern. Es opfert die Anwendung, um den Container am Laufen zu halten. Es ist keine Tatsache, dass der Container fallen wird, aber die darin ausgeführte Anwendung wird definitiv fallen. Dies passiert, wenn Sie den Speicherverbrauch einer Java-Anwendung unkontrolliert lassen. Nochmals zum Thema Katzen. Wenn Sie sich am Samstag entschieden haben, länger zu schlafen und vergessen haben, den Katzen Futter zu geben, dann ist OOM Killer genau das Richtige für SieDie Blumen sind garantiert, die Töpfe dürfen nicht beschädigt sein, die Blumen müssen jedoch neu gepflanzt werden. Wie hängen Container und Java zusammen?  - 6 Was ist der Unterschied zwischen OOM Error und OOM Killer? Sie können den OOM-Fehler verarbeiten und einige Aktionen ausführen (z. B. die Anwendung skalieren), und OOM Killer bricht einfach den gesamten Prozess ab. OOM Killer ähnelt kill-9 (kill minus nine) – ein Befehl, der einen Prozess unter Linux beendet . Wie hängen Container und Java zusammen?  - 7 Tatsache ist, dass die beliebteste Containerimplementierung der Docker- Container ist, der auf Linux basiert . Selbst wenn Sie ihn unter Windows ausführen , stammt der Kernel immer noch von Linux . Unter Linux interessieren wir uns für ein Konzept: CGroups (engl. Kontrollgruppe) – ein Linux-Kernel-Mechanismus, der Rechenressourcen (Prozessor, Netzwerk, Speicherressourcen, I/O-Ressourcen) für Gruppen von Prozessen begrenzt und isoliert. Einfach ausgedrückt ermöglicht dieser Mechanismus die Verwaltung von Ressourcen in einem Container, in unserem Fall dem Speicher. In welcher Beziehung steht Java dazu? Über den CGroups- Mechanismus kann sich Java an den Containerspeicher binden. Aber das hängt alles von der Java-Version ab. Beispielsweise weiß Java 7 nicht, wie man CGroups verwendet , und Containergrenzen sind ihm nicht bekannt. Standardmäßig beträgt die maximale Heap-Größe ¼ physischen Speicher. Wenn die Anwendung die Containergrenzen überschreitet, kommt es zu einem OOM-Killer , und wenn die Containergrenzen nicht festgelegt sind, nimmt die Anwendung Speicher von anderen Anwendungen auf dem Server (es ist besser, Grenzen festzulegen, sonst verlieren alle). . Sie können natürlich Heap- Einstellungen verwenden oder spezielle „Bilder“ verwenden, die dieses Problem lösen, aber am einfachsten ist es, die richtige Java-Version zu verwenden. Korrekte Versionen beginnen mit Java 8 x131 (portiert von Java 9), es beginnt, CGroups zu verstehen . Und in Java 10 erschien Unterstützung für Container: UseContainerSupport , später wurde diese Funktion auf Java 8 x 191 portiert . Oder Sie können einfach Java: 11+ verwenden . Was lässt sich schlussfolgern: Wenn Sie Containerspeicher verwenden, erhalten Sie möglicherweise einen OutOfMemoryError (OOM-Fehler) oder einen OutOfMemoryKiller (OOM-Killer). Im ersten Fall stürzt die Anwendung nicht sofort ab, der OOM-Fehler kann abgefangen, verarbeitet und kontrollierte Maßnahmen ergriffen werden. Skalieren Sie beispielsweise die Anwendung. Wenn ein OOM-Killer auftritt, stürzt die Anwendung sofort ab und es gibt keine Optionen mehr zum Speichern. Und das Schlimmste ist, dass der Behälter selbst äußerlich in Ordnung ist, das heißt, Sie können nicht einmal vermuten, dass dort etwas heruntergefallen ist. Zur Interaktion mit Container und Java-Speicher werden Linux-Mechanismen verwendet. Aber nicht jedes Java implementiert sie. Um Probleme mit Java 8 zu vermeiden, müssen Sie eine Version ab 131 oder besser ab 191 verwenden. Oder verwenden Sie Java: 11+. Zum Üben: OutOfMemoryError: Fangen Sie es ab, wenn Sie können
Kommentare
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION