この記事はWeChatの公開アカウント「Angela's Blog」から転載したもので、著者はAngelaです。この記事を転載する場合は、アンジェラのブログの公開アカウントにご連絡ください。 杭州のオフィスビルでは、アンジェラは新しいパフォーマンスの準備を整え、新しく購入した19.9の革靴を履いてガラスの仕切りのあるオフィスに入ってきた。 面接官: 履歴書を見ると、JVM に多少精通していると書かれていますね。 アンジェラ:はい インタビュアー: では、ヒープメモリのパーティショニングについて教えてください。 アンジェラ: [考えながら]: これは簡単。さあ、JVM の基本を復習しましょう。 ヒープは新しい世代と古い世代に分かれていることがわかっています。新しい世代は Yong 世代と呼ばれ、古い世代は Old 世代と呼ばれます。 インタビュアー:それから? アンジェラ: それからどうするの? インタビュアー:もう終わりですか?もう終わりですか?新しい世代についてはどうですか? アンジェラ: 聞きたいなら、私に言ってください。言わなければ、あなたが聞きたいかどうか、私にはわかりません。 新しい世代は、エデン領域とサバイバー領域に分かれています。サバイバー領域は、From 領域と To 領域で構成されています。完全なメモリ構造を描いてみましょう。描かないでください。ペンを渡していただければ、下の図のように描きます。 インタビュアー:ああ、その写真はいいのですが、ヒープが若い世代と古い世代に分かれているのはなぜですか? アンジェラ: もちろん、メモリをより効率的に管理するためです。 インタビュアー:それはどのように言うのですか? アンジェラ: 新世代と旧世代を区別しないと、メモリがブロック全体になると仮定しましょう。ガベージ コレクターは、寿命の長いオブジェクトを、寿命の短いオブジェクトと一緒に毎回リサイクルします。一般的に、寿命の長いオブジェクトはアプリケーションのライフサイクルと一致している可能性があり、基本的にリサイクルできません。たとえば、Spring フレームワークの Bean 管理に関連するオブジェクト (ApplicationContext) は、アプリケーションの操作全体にわたって存在します。一般的に、これらは数回のリサイクル後に旧世代に配置されます。ただし、新世代と旧世代を区別せず、毎回一緒にリサイクルすると、パフォーマンスの消費が非常に大きくなります。 古い世代と新しい世代を区別した後、古い世代は寿命の長いオブジェクトを保存するために使用され、新しい世代はライフサイクルの短いオブジェクトを保存するために使用されます。古い世代のオブジェクトは非常に安定しており、新しい世代のリサイクルは古い世代に影響を与えないため、リサイクル効率が大幅に向上します。 インタビュアー:では、なぜ新世代はエデン、From、Toの3つのエリアに分かれているのでしょうか? アンジェラ: [だんだん面白くなってきました] まず、ほとんどの物体のライフサイクルは非常に短いです。新世代が複数の領域に分割されていない場合、新世代のリサイクルスキームは 2 つある可能性があります。 最初の可能性は、各コレクションが新しい世代のメモリ全体に対して実行されることです。完全なガベージ コレクション プロセスは、次の 3 つのステップに分かれています。 最初にクリーンアップする必要があるオブジェクト マーカーを見つける必要があります。 これらのマークされたオブジェクトをクリーンアップします。 残りのオブジェクトを移動し、昇格年齢に達したオブジェクトを古い世代に移動します。 オブジェクトがリサイクルされると、大量のメモリフラグメントが生成されます(多くのオブジェクトがリサイクルされます)。メモリの断片化を解決するには、残りのオブジェクトを移動する必要があり(マークスイープアルゴリズム)、リサイクルプロセス全体の効率は非常に低くなります。 2 つ目の可能性は、Survivor 領域 (From + To) がない場合、Minor GC (新世代リサイクル) プロセス中に、生き残ったオブジェクトが直接旧世代に送られることです。この場合、旧世代はすぐにいっぱいになり、Major GC がトリガーされます (Major GC は一般に Minor GC を伴うため、Full GC がトリガーされたと見なすこともできます)。Full GC が頻繁に発生すると、プログラムの実行速度と応答速度に影響します。 新しい世代のコレクションはマイナー GC と呼ばれ、古い世代のコレクションはメジャー GC と呼ばれます。 インタビュアー: なぜ2つのサバイバーゾーンが必要なのでしょうか? アンジェラ: サバイバーエリアが 1 つしかない場合の新世代メモリリサイクルプロセスを見てみましょう。 上の画像に沿って説明します。エデンエリアが初めていっぱいになったとき、メモリのリサイクルは非常に簡単です。エデンエリアで生き残ったオブジェクトをサバイバーエリアに入れるだけです。 2 回目のメモリ リサイクルでは、Eden エリアと Survivor エリアの 2 つの場所をリサイクルする必要があります。
ここで 2 つの Survivor 領域を設定する理由は、メモリの断片化を避けるためだとするオンライン記事をいくつか見ました。これは、2 回目 (およびそれ以降) のリサイクル、つまりメモリのリサイクルでは、まず Eden 領域をリサイクルし、次に Survivor 領域をリサイクルすると想定されているためです。このようにすると、もちろんメモリの断片化が発生しますが、実際に Survivor 領域が 1 つしかない場合、ガベージ コレクションの設計者は、まず Survivor 領域を再利用し、次に Eden 領域を再利用しているはずです。Survivor 領域がリサイクルされてソートされた後、Eden 領域に格納されているオブジェクトは Survivor 領域に移動されるため、Survivor アドレスは連続し、メモリの断片化は発生しません。したがって、本当の理由は、以下で説明する効率の問題です。 インタビュアー:それの何が問題なのですか? アンジェラ: これにはいくつか問題があります。
したがって、最終的な分析では、2 つの残存領域は依然としてパフォーマンス上の考慮事項であり、マーク コピー アルゴリズムはマーク コンパイル アルゴリズムよりも効率的です。 インタビュアー:では、エデンに加えて 2 つのサバイバー エリアで使用されているマーキングとコピーのアルゴリズムについて詳しく教えてください。 アンジェラ: 新しい世代のオブジェクトの 98% は「一夜にして生まれて死ぬ」ため、Eden スペースと Survivor スペースを 1:1 の比率で分割する必要はありません。代わりに、新しい世代は、より大きな Eden スペースと 2 つのより小さな Survivor スペースに分割されます。毎回使用されるのは Eden と Survivor[0] (From 領域) の 1 つだけであり、Survivor[1] (To 領域) はマークされたレプリケーションの実装用に残されます。 リサイクル時には、EdenとSurvivor[0]内のすべての生き残ったオブジェクトが別のSurvivor[1](To)スペースに一度にコピーされ、最後にEdenと使用したSurvivorスペースがクリーンアップされます。 もう一つの注意点: From 領域と To 領域は、各マイナー GC 後に変換されます。From 領域は To 領域になり、To 領域は From 領域になります。これは単なる論理識別子です。 デフォルトでは、HotSpot 仮想マシンは Eden と Survivor のサイズ比を 8:1 に設定します (CMS には適用されません)。つまり、各新世代で使用可能なメモリ領域は、新世代全体の容量の 90% (80% + 10%) であり、メモリの 10% のみが「無駄」になります (メモリの 10% (Survivor To 領域) は常に空になります)。 マークコピーアルゴリズムのプロセス:
インタビュアー:今、たくさんお話をいただきましたが、ここに来る前に質問を暗記したのですか? アンジェラ: [考えながら] 答えられなかったら、テクノロジーに対する情熱がないと言われます。答えられたら、質問をただ暗記しているだけだと言われます。何だって? 。 私はインタビュアーに辛抱強く説明しました。「どうしてそんなことが可能なのですか?ここに来る前に、アンジェラのブログの公開アカウントの記事を全部読んだだけなんです、笑」 インタビュアー:どこで見ることができますか?教えてください。 インタビュアー: 旧世代のメモリ回復戦略についてはどうですか? マークコンパクト アルゴリズムについてはどうですか? また、一般的なガベージ コレクターである CMS と G1 についても教えてください。 アンジェラ:もうそのことについて話したくないです。疲れたので。2回目の面接のときに話しましょうか? 面接官:大丈夫です。また2人目の面接官になりますので、直接お話しください。 アンジェラ:本当にそれについて話したくないんです。 インタビュアー: 今日はここまでにしましょう。戻って次の連絡を待ちます。このドアを出たら左に曲がってください。 この記事は読者の質問から生まれました。 |
<<: 張三が試験でカンニングをしたい場合、どのような暗号化アルゴリズムを使用すればよいでしょうか?先生にバレないように?
>>: 機械学習の収益は2023年までに803億ドルに達すると予想されている
人工知能(AI)は、現在世界で最も革新的で影響力のある技術の1つであり、さまざまな分野や産業に浸透し...
ディープラーニング モデルを本番環境に導入することは、優れたパフォーマンスのモデルをトレーニングする...
休暇の計画を立てることは、かつては時間がかかり、困難な作業でした。目的地の調査、宿泊施設の探し方から...
AI 人材とプロジェクト パイプラインを構築するには、教育的価値だけでなく技術的価値も必要です。そ...
ディープフェイクの世界では、真実と虚偽を区別することが難しい場合があります。 AIアルゴリズム「ディ...
人工知能のスタートアップ企業OpenAIは8月16日、GPT-4がコンテンツレビュー機能をテストして...
大規模言語モデル (LLM) は、数百万または数十億のパラメータを持つ人工ニューラル ネットワークで...
近年、人工肉は急速に発展していますが、本物の肉と比較すると、味や食感にはまだ明らかな差があります。最...
[[321983]]この記事はAI新メディアQuantum Bit(公開アカウントID:QbitAI...
最近、ディープラーニングが大々的に宣伝されており、人々はニューラル ネットワークをあらゆる場所で使用...