JavaRush /Java Blog /Random-JA /コンテナと Java はどのように関係していますか?
Павел
レベル 11

コンテナと Java はどのように関係していますか?

Random-JA グループに公開済み
コンテナーと Docker について読んだことはあるが、Java がどのようにコンテナーに取り込まれているかを理解していない人向けです。まず、 Java メモリについて思い出してみましょう。メモリはサーバーの RAM (ランダム アクセス メモリ) を使用するスタックとヒープで構成されていることに注意してください。メモリについてさらに詳しく話す場合は、RAM を指します。 次に、コンテナの断面を見てみましょう。 コンテナと Java はどのように関係していますか?  - 1 いいえ、もちろんそうではありません。臀部と太ももには興味がありません。コンテナ内のメモリ構造を調べます。これは 3 つの部分に分けることができます。 • ヒープ メモリ – ヒープ自体。• オフ ヒープとは、ヒープ内にないすべてのものです。• OS オーバーヘッドは、コンテナ内でプロセスを実装するためのメモリ オーバーヘッドです。 コンテナと Java はどのように関係していますか?  - 2 たとえば、コンテナに 1 Gb を割り当てました。図では、それがコンテナ制限になります。その境界は青い四角形で示されます。コンテナ内の Java メモリに 80%、つまり 0.8 Gb を割り当てました。OSオーバーヘッドがリソース(オーバーヘッド)の一部を占めていたため、ヒープがコンテナの約 80%、つまり 0.8 Gb をはるかに下回っていました。プロセスを維持するため。コンテナーの約 20% は、ヒープに接続されていないすべてのもの ( Off Heap ) のために残されます。図中の使用領域は、アプリケーションを実行するために使用されるメモリ領域を示します。次に、コンテナ内のメモリが不足する可能性がある状況について説明する必要があります。 OutOfMemoryError アプリケーションのメモリ消費量 (使用領域) がヒープ制限 ( Heap ) に達すると、 OutOfMemoryError (OOM エラー)が発生します。これは、ヒープ、つまりアプリケーションでプログラムによって作成されたオブジェクトが配置されるメモリ領域に十分な領域がないことを意味します。 まだ完全に明確でない場合は、猫で説明します。 OOMエラー とは、猫がバルコニーへのドアの前で長い間叫び続け、このドアが開いたときに出入り口に立ったままどちらにも行かない場合、彼らはよく猫が凍っていると言います。あなたが時間内に彼を押し出すと、彼は顎を下げてバルコニーに行き、子猫の用事をするでしょう。 OOM キラー これは、メモリが不足したときにコンテナ内で発生する可能性のあるもう 1 つの状況です。 プログラムがコンテナの外に出ると、OutOfMemory キラー (OOM キラー)が発生します。これは、カーネルのクラッシュを防ぐためにアプリケーションを終了するプロセスです。コンテナーを実行し続けるためにアプリケーションが犠牲になります。コンテナが落ちることは事実ではありませんが、コンテナ内で実行されるアプリケーションは間違いなく落ちます。これは、Java アプリケーションのメモリ消費を制御しないままにすると発生します。またしても猫の話。土曜日にもっと寝ようと思って猫に餌を与えるのを忘れたら、OOM Killerコンテナと Java はどのように関係していますか?  - 3コンテナと Java はどのように関係していますか?  - 4 コンテナと Java はどのように関係していますか?  - 5花は保証されており、鉢が損傷することはありませんが、花は植え替える必要があります。 コンテナと Java はどのように関係していますか?  - 6 OOM エラーと OOM キラーの違いは何ですか? OOM エラーを処理していくつかのアクション (例: アプリケーションのスケーリングなど) を実行すると、OOM Killer は単純にプロセス全体を強制終了します。 OOM Killer は、Linuxでプロセスを強制終了するコマンドであるkill-9 (kill マイナス 9)に似ています。 問題は、最も人気のあるコンテナ実装はLinuxに基づいたDockerコンテナであり、それをWindows上で実行したとしても、カーネルは依然としてLinuxのものであるということです。Linux では、 CGroups (英語のコントロール グループ) という 1 つの概念に興味があります。CGroups (英語のコントロール グループ) は、プロセスのグループのコンピューティング リソース (プロセッサ、ネットワーク、メモリ リソース、I/O リソース) を制限および分離する Linux カーネル メカニズムです。 簡単に言うと、このメカニズムにより、コンテナ内のリソース (この場合はメモリ) を管理できるようになります。 Java はこれにどのように関係するのでしょうか? Java がコンテナ メモリにラッチできるのは、CGroups メカニズムを通じてです。ただし、これはすべて Java のバージョンによって異なります。たとえば、Java 7 はCGroupsの使用方法を知りませんし、コンテナの制限も知りません。デフォルトでは、最大ヒープ サイズ =物理メモリの 1/4 です。アプリケーションがコンテナーの制限を超えると、 OOM Killerが発生し、コンテナーの制限が設定されていない場合、アプリケーションはサーバー上の他のアプリケーションからメモリを奪います (制限を設定することをお勧めします。そうしないと全員が損失します)。 。もちろん、ヒープ設定を使用したり、特別な「イメージ」を使用してこの問題を解決することもできますが、最も簡単な方法は、正しいバージョンの Java を使用することです。正しいバージョンはJava 8 x131 (Java 9 から移植)から始まり、 CGroupsを認識し始めます。そしてJava 10 では、コンテナーのサポートが登場しました: UseContainerSupport。その後、この関数はJava 8 x 191に移植されました。または、単にJava: 11+を使用することもできます。結論としては次のとおりです。 コンテナと Java はどのように関係していますか?  - 7コンテナー メモリを使用すると、OutOfMemoryError (OOM エラー) または OutOfMemoryKiller (OOM Killer) が発生する場合があります。最初のケースでは、アプリケーションはすぐにはクラッシュせず、OOM エラーを捕捉し、処理し、制御されたアクションを実行できます。たとえば、アプリケーションをスケーリングします。OOM Killer が発生すると、アプリケーションはすぐにクラッシュし、アプリケーションを保存する選択肢はなくなります。そして最悪のことは、コンテナ自体は外見上は問題がない、つまり、そこに何かが落ちているとは思わないかもしれないということです。Linux メカニズムは、コンテナーおよび Java メモリーと対話するために使用されます。ただし、すべての Java がこれらを実装しているわけではありません。Java 8 の問題を回避するには、131 以降のバージョン、できれば 191 以降のバージョンを使用する必要があります。または、Java: 11 以降を使用します。 練習用: OutOfMemoryError: 可能であればキャッチしてください
コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION