面接でよく聞かれる JVM の重要なポイントは何ですか?

面接でよく聞かれる JVM の重要なポイントは何ですか?

この記事はWeChatの公開アカウント「Java Geek Technology」から転載したもので、著者はDuck Blood Fan Tangです。この記事を転載する場合は、Java Geek Technology の公開アカウントにお問い合わせください。

面接中、多くの面接官が JVM について質問します。開発者としては、プログラム カウンターから始まり、ヒープ、スタックと JVM が多すぎるため、面接官の質問の要点を把握することが難しいことがよくあります。しかし、私たちは面接中にこの質問にうまく答えることができません。多くの場合、体系的に読んでいないため、面接の質問に答えるときに支離滅裂になり、うまく答えられなくなってしまいます。数日後に、JVM 面接チュートリアルを共有します。役に立った場合は、いいね、フォロー、ブックマークをお願いします。

JVMをご存知ですか?

まず第一に、この質問をする人は、通常、すでにいくつかの基本的な質問をしています。この時点で、最初から JVM について話し始める必要があります。実際に多くの人がガベージコレクションのメカニズムについて考えます。確かにその通りですが、それがガベージ コレクション メカニズムであるかどうかを尋ね始めると、すでに間違った質問に答えていることになります。

なぜそんなことを言うのでしょうか? JVM のガベージ コレクション メカニズムはヒープ メモリ内で実行されるためです。ただし、JVM の分割はヒープ メモリだけではありません。この質問にはどのように答えればよいでしょうか?

** JVM の内部構造、最も重要な内部構造は何ですか!**

JVMは2つの部分に分かれています

1. スレッド共有領域

2. スレッドプライベートエリア

スレッド共有領域には、ヒープ、メソッド領域が含まれます。

スレッドプライベート領域には、プログラムカウンタ、仮想マシンスタック(スタック)、ローカルメソッドスタックが含まれます。

JVM はヒープだけではない、他のものも不可欠である。なぜそんなことを言うのですか?

面接官の中には、JVM クラスのロード メカニズムを理解しているかどうかを尋ねる人もいるからです。

ガベージコレクションのメカニズムだけを理解している場合、この質問は少しわかりにくく、混乱します。これはバービーQじゃないの?

では、JVM クラスロードメカニズムとは何でしょうか?

答え:

まず、.class バイトコード ファイルがクラス ローダー (ClassLoader) を介してメモリ (ランタイム データ領域) にロードされます。バイトコード ファイルは、JVM の命令セット仕様のセットに過ぎず、実行のために基盤となるオペレーティング システムに直接渡すことはできません。したがって、バイトコードを基礎となるシステム命令に変換し、それを CPU に渡して実行するために、特定のコマンド パーサー実行エンジン (実行エンジン) が必要です。このプロセスでは、プログラム全体の機能を実装するために、他の言語のネイティブライブラリインターフェース(ネイティブインターフェース)を呼び出す必要があります。

我々は道を外れてしまった。前の質問への回答を続けましょう。理解したとおっしゃって、内部構造についてもお答えいただいたので、その内容が何に使われているのかについてお話しすべきではないでしょうか。はい、その通りです。それが答えです。

  • プログラムカウンタ: スレッド実行の場所を記録し、スレッド切り替え後の再実行を容易にします。
  • 仮想マシン スタック: 各スレッドは作成時に仮想マシン スタックを作成し、Java メソッド呼び出しに対応するスタック フレームを格納します。
  • ローカルメソッドスタック: ネイティブメソッドを実行するために使用します

これを言った後は、何か言うことがない限り、一時停止しないでください。一呼吸置くと、面接官はスタックのいくつかの特性について質問してくる可能性が高くなります。もともとガベージ コレクションのメカニズムについてお話したかったので、誤解されるわけにはいかないので、そのまま続けてください。

  • メソッド領域: スレッドで共有され、仮想マシンによってロードされたクラス情報、定数、静的変数、ジャストインタイムコンパイラによってコンパイルされたコードなどが格納されます。

最後に、ヒープについてお話しましょう。

ヒープは Java 仮想マシンによって管理されるメモリの最大の領域であるため、JVM で最も重要な領域です。

唯一の目的はオブジェクト インスタンスと配列を格納することであり (JDK7 では文字列定数プールとクラスの静的変数が Java ヒープへ移動されました)、ほぼすべてのオブジェクト インスタンスがヒープに格納されます。

しかし、JIT コンパイラの開発により、エスケープ解析、スタック割り当て、スカラー置換などの最適化技術によって、すべてのオブジェクトがヒープ上に割り当てられなくなりました。

この時点で、面接官は通常、質問を開始し、ヒープ メモリについて具体的に話すように求めます。

Javaヒープ

Java ヒープは、ガベージ コレクターによって管理される主要な領域です。ヒープメモリは新しい世代(Young)と古い世代(Old)に分かれています。

新世代とは何ですか?

主に新しいオブジェクトを保存するために使用されます。通常、ヒープ領域の 1/3 を占有します。オブジェクトが頻繁に作成されるため、新しい世代ではガベージ コレクションのために MinorGC が頻繁にトリガーされます。

古い世代とは何ですか?

古い世代のオブジェクトは比較的安定しているため、MajorGC は頻繁に実行されません。

それでは、新しい世代と古い世代の JVM をそれぞれ紹介しましょう。これら 2 つだけで、面接官と 10 分以上話すのに十分です。

JVM の新世代 (ガベージ コレクション メカニズム)

新しい世代は、Eden エリア、ServivorFrom、ServivorTo の 3 つのエリアに分かれています。

  • Eden 領域は、新しい Java オブジェクトの発生場所です (新しく作成されたオブジェクトが大量のメモリを占有する場合は、古い世代に直接割り当てられます)。 Eden 領域のメモリが不足すると、MinorGc がトリガーされ、新しい世代領域でガベージ コレクションが実行されます。
  • ServivorFrom 領域内の前回の GC の残存オブジェクトがこの GC でスキャンされます。 JVMが新しいオブジェクト用のメモリスペースを割り当てられない場合(Eden領域がいっぱいの場合)、JVMはMinorGcをトリガーします。
  • ServivorToエリア

MinorGc プロセスの残存プロセスは保持されます。

では、新世代ではどのようなガベージ コレクション メカニズムが使用されるのでしょうか?

新しいオブジェクトを作成するたびに、まずそれを新しい世代の Enden 領域に配置します。これは、最初は次のようになります。

そして、Enden が使い果たされると、リサイクルできるアイテムが残ります。

その後、生き残ったオブジェクトは Survior1 (from) にコピーされ、リサイクルされるオブジェクトはリサイクルされるのを待機します。

次に、エンデンエリアをクリアしてリサイクルします

この場合、最初のGCが完了し、

Enden がいっぱいになると、GC が再度実行されます。

最初はこんな感じでした

そして、EndenとSurvoir1の内容がSurviorにコピーされ、

そうなるとエンデンとサバイバーはリサイクルされる

すると、Enden を通過するものは移動回数が少ないものと同等になり、Survior1 を通過するものは 2 回移動するものと同等になります。

このようにして、新しい世代の GC が 2 回実行されます。

Enden を再度使用すると、Survior2 から Survior1 にコピーされます。

次はリアントゥ

コレクション後、Survior1が変更されました。オブジェクト 1 は Enden から直接コピーされ、オブジェクト 2 は Enden -->Survior2 -->Survior1 からコピーされ、オブジェクト 3 は Enden -->Surivior1 -->Survior2 -->Survior1 からコピーされます。ステップごとに実行すると、新しい世代の GC になります。

これは新世代で使用される GC です。面接官に説明する必要がある場合は、この図を上手に覚えておく必要があります。なぜそんなことを言うのでしょうか?この図をマスターして初めて、このコピーアルゴリズムを面接官に明確に説明できるようになります。

このレプリケーション アルゴリズムについては既にご存知かと思いますが、その欠点は何でしょうか?

  • 最も明らかな問題は、ヒープ利用効率が低いことです。スペースは半分に分割されており、一度に使用できるのは半分だけです。
  • 再帰呼び出しでは、サブオブジェクトをコピーするときに再帰メソッドが使用されるため、スタック オーバーフローが発生する可能性があります。

しかし、レプリケーション アルゴリズムの素晴らしさについても自慢しなければなりません。

高いスループット スループットとは、アクティブなオブジェクトの検索に費やされた時間とヒープ検索に費やされた時間の比率です。スループットが高ければ高いほど、有効な検索比率が高くなります。ルートから開始し、ガベージ オブジェクトの検索に時間を無駄にすることなく、すべてのアクティブ オブジェクトを検索することを理解するのは難しくありません。この利点は、ヒープ サイズが大きいほど顕著になります。

破片なし

アクティブ オブジェクトが To スペースにコピーされると、それらはすべて隣り合って配置され、From がクリアされるとすべてクリアされるため、断片化の可能性はまったくありません。

これは、新世代で使用されるガベージ コレクション アルゴリズムでもあります。

JVM の旧世代 (ガベージ コレクション メカニズム)

旧世代のガベージコレクションのメカニズムは、新世代のガベージコレクションのメカニズムとは異なる方法を採用しています。これを FullGC と呼ぶ人もいます。 FullGC が発生する理由は、何らかの理由で、新しい世代の既存のオブジェクトまたは新しく作成されたオブジェクトを古い世代に移動する必要があるが、古い世代にこのオブジェクトを収容するのに十分なメモリ領域がない場合、FullGC がトリガーされるからです。 FullGC を実行した後もこれらのオブジェクトにメモリを割り当てる方法がない場合は、例外をスローする必要があります。例外の種類は OutOfMemoryError です。

FullGC で使用されるアルゴリズムは、MinorGC で使用されるアルゴリズムとは異なります。マークスイープアルゴリズムを使用します。名前は分かりやすいですね。図を使って分析してみましょう。 「JVM徹底理解」という本に載っている図は次のようになります。

アイコンははっきり見えるので、まずマークしてから削除します。

  • マーキング プロセス: アクセス可能なすべてのオブジェクトを検索し、指定されたマークを付けます。
  • スイープ プロセス: ヒープ メモリを走査し、マークされていないオブジェクトをリサイクルします。

これを理解した後、GC ルートという概念について話す必要があります。ルートは次のようにルートノードとして理解できます。

上の図では、a、b、c、d は生物です。参照がある場合、たとえば b が a を参照している場合、a は生きているオブジェクトです。旧世代のメモリ領域に有効なメモリスペースが十分にない場合、世界全体が停止し、ガベージコレクションの準備が始まります。

  • マーキング: すべての GC ルートをトラバースし、GC ルートから到達可能なすべてのオブジェクトをライブ オブジェクトとしてマークします。これらは、図では a、b、c、d でマークされています。クリア: クリア プロセスはヒープ内のすべてのオブジェクトを走査し、マークされていないすべてのオブジェクトをクリアします。つまり、メモリが不足している場合は、GC スレッドがトリガーされ、プログラムが一時停止されます。次に、まだ生きているオブジェクトがマークされ、最後にヒープ内のマークされていないオブジェクトがすべてクリアされ、プログラムが再開されます。

フローチャートは次のようになります。古い世代のオブジェクトの開始時状態

現時点ではデータはマークされていません。そして、メモリが不足すると、GC スレッドが停止し、マーキングを開始します。

ルート ノードから開始して、マークされた abcdeh (すべて残存オブジェクト) をトラバースし、マーク付けを開始します。

次はデータを消去します

クリアが完了するとマークは削除され、次回マークをクリアするとクリアを継続できます。

実際、Afen の昔の読者はこの絵を見たことがあるに違いありません。なぜなら、Afen はこの絵をずっと昔に描いたからです。

これでマークスイープ操作は完了です。

現時点では、誇張や批判なしに、利点と欠点があるはずです。そうでなければ、なぜ他の方法を使用しないのですか?結局のところ、JVM は GC を実行するための最も適切な方法を必ず選択します。

デメリット: ヒープ メモリをクリアすると、スペースが不連続になり、メモリが断片化されます。次回オブジェクトを割り当てるために必要なメモリが断片化された領域よりも大きい場合は、事前に GC がトリガーされます。 GC が回復した後も領域が不足している場合は、OOM などのエラーが発生します。

時間の問題: 2 つのプロセス (マーキングとクリア) に分かれているため、ヒープ内にリサイクル可能なオブジェクトが多数ある場合、アルゴリズムは大量のマーキングとクリアを実行する必要があります。これにより問題が発生します。リサイクル可能な物体の数が増えると、マーキングと除去の効率が低下します。さらに、スペースの不連続性により、空きリストは再度割り当てられるたびに走査される必要があります。

幾分

実装が簡単で、保守的な GC アルゴリズムと互換性があります。その他の利点については、本当に何も言えません。参照カウント アルゴリズムによって発生する、クリアできない循環参照の問題を解決できるということ以外は、よくわかりません。

JVM に関する重要なポイントを学びましたか?

<<:  クラウドコンピューティングと人工知能が、先進的な企業に前例のない機会を生み出す方法

>>:  クラウドネイティブではコードとしての監視とコードとしてのインフラストラクチャが必要な理由

推薦する

FtuanとGaopengが合併し、GroupNetの新しいドメイン名を宣伝

Ftuanは新浪微博で、その実体会社が正式に「北京王洛天下生活科技有限公司」に改名され、英語名はGr...

電子商取引ライブストリーミング:「大ボス」李佳琦、「新人」張大宜

ダブルイレブンの先行販売初日、李佳琦が人気を集めた。 10月20日夜、「口紅王」李佳琦の生放送ルーム...

タオバオの技術発展レビュー(I):独身の日カーニバル

「時間切れ、ゲット開始!」長い間パソコンの前に座って待っていたシャオメイは、2011年11月11日0...

VaporNode - $15/年/KVM/128m メモリ/10g SSD/500g/フロリダ

VaporNode.com のフロリダ データ センターには、特別価格の VPS が 2 つあり、ど...

ウェブサイトを構築した後は、ウェブマスターツールを使用して詳細を確認してください。

ウェブサイトを構築し、十分に最適化されたと感じたら、次の手順とツールを使用して、最適化が必要な詳細を...

ウールとギャング:インターネット クラウドソーシングをファッションに導入

「編み物」といえば、多くの人は次のような光景を思い浮かべるでしょう。庭のロッキングチェアに座り、老眼...

百度と360は24時間以内に5回目の攻撃をしかけ、360は起訴される可能性も

赤いローブのリーダーは再び昔のトリックを使い、「ユーザーファーストの魔法の武器」を使って百度を攻撃し...

ウェブサイト運営に関するウェブマスターの見解

ウェブサイトを構築した後に遭遇する最大の問題は、ウェブサイトの運用と保守です。優れたウェブサイトは、...

SEOの開発とソリューションに立ち向かう

私が初めて SEO に触れたのは 2002 年です。SEO に携わる人なら、2003 年の中国の S...

インターネットプロモーションの一般的な傾向Qishengインターネットは、専門的なインターネットプロモーションサービスプラットフォームを作成します

月収10万元の起業の夢を実現するミニプログラム起業支援プランインターネットの急速な発展に伴い、世界中...

医療ウェブサイトの直帰率における訪問者を強制的に直帰させる 6 つの SEM の罪

著者は、「SEM の医療 SEO は検索エンジンの背後にいるユーザーに焦点を当てている」、「SEM ...

Googleは昨年、検索アルゴリズムを450回調整した。

Google は社内の仕組みについて口を閉ざしていることで知られているが、うっかり漏れてしまうような...