11のグループの関係により、JVMを明確に把握できます。

11のグループの関係により、JVMを明確に把握できます。

[[358883]]

では、早速本題に入りましょう。

グループ 1: JDK、JRE、JVM の関係

JDK には JRE が含まれ、JRE にも JDK が含まれ、JRE にも JDK が含まれます。

スコープ関係: JDK>JRE>JVM。

詳細については、下の図を参照してください。

グループ2: .java ファイルと .class ファイルの関係

両者の関係を説明するには、次の 2 つの図が必要です。

グループ3: クラスファイルとJVMの関係

JVM はクラス ロード メカニズムを通じてクラス ファイルを JVM にロードし、次に JVM はクラス ファイルの内容を解析します。そのため、クラス ロード プロセスにはリンクと初期化が存在します。

グループ4: クラスローダーの関係

説明のための写真:

グループ 5: メソッド領域、ヒープ、スタックの関係は何ですか?

写真に直接:

スタックはヒープを指す

スタック フレームに変数がある場合、その型は次のような参照型になります。

  1. パッケージ com.tian.my_code.test;
  2.  
  3. パブリッククラス JvmCodeDemo {
  4. パブリックオブジェクトtestGC(){
  5. op1 = 10;
  6. op2 = 3;
  7. オブジェクト obj = 新しいオブジェクト();
  8. オブジェクト結果=obj;
  9. 結果を返します
  10. }
  11. }

このとき、スタック内の要素 obj は通常、ヒープ内の Object オブジェクトを指し、結果は obj と同じオブジェクトを指します。

コマンドを使用する

  1. javac -g:vars JvmCodeDemo.java

コンパイルして使用する

  1. javap -v JvmCodeDemo.class >log.txt

次にlog.txtファイルを開きます

メソッド領域はヒープを指す

メソッド領域には、静的変数、定数、その他のデータが格納されます。

次のような状況が発生する場合、メソッド領域内の要素がヒープ内のオブジェクトを指している典型的なケースです。

ヒープはメソッド領域を指す

メソッド領域にはクラス情報が含まれ、オブジェクトはヒープに格納されます。オブジェクトを作成するための前提条件は、対応するクラス情報を持つことであり、このクラス情報はメソッド領域にあります。

グループ 6: マイナー GC、メジャー GC、フル GC の関係

マイナーGC: 若い世代で発生するGC。

  • マイナー GC は、若い世代のスペース (Eden および Survivor 領域を含む) からメモリを回収することを指します。マイナー GC は、Eden 領域がいっぱいの場合など、JVM が新しいオブジェクト用のスペースを割り当てることができない場合にトリガーされます。
  • Eden 領域がいっぱいになると、MinorGC がトリガーされます。このとき、エデンエリア内の生き残ったオブジェクトはサバイバーエリアにコピーされます。オブジェクトは、Survivor 領域で一定数の MinorGC を生き延びた後、古い世代に昇格されます (もちろん、すべてのオブジェクトがこのように古い世代に昇格されるわけではありません)。古い世代がいっぱいになると、OutofMemory 例外が報告されます。
  • すべての MinorGC はストップザワールドをトリガーし、アプリケーションのスレッドを停止しますが、このプロセスは非常に短いです。

メジャー GC: 古い世代で発生する GC。

  • メジャー GC は Tenured 領域 (古い世代) をクリーンアップします。

フル GC: 新しい世代 + 古い世代。たとえば、メソッド領域は、若い世代と古い世代の回復を引き起こします。

グループ7: サバイバーとエデンの関係

どちらの場合も、最も重要なことは、Survivor スペースがなぜ必要なのかを理解することです。エデンだけで十分じゃないの?

Survivor が存在しない場合、Eden 領域でマイナー GC が実行され、年齢制限がない場合、生き残ったオブジェクトは古い世代に送信されます。このようにして、古い世代はすぐに満たされ、メジャー GC がトリガーされます (メジャー GC は通常マイナー GC を伴うため、フル GC をトリガーするとも考えられます)。旧世代のメモリ空間は新世代のメモリ空間よりもはるかに大きく、フル GC はマイナー GC よりもはるかに長い時間がかかります。

実行時間が長い場合の欠点は何ですか?

頻繁なフル GC は長い時間がかかり、大規模なプログラムの実行速度と応答速度に影響します。

では、古い世代のスペースを増やしたり減らしたりするといいでしょう。

古い世代のスペースを増やすと、より多くの残存オブジェクトが古い世代を埋めることができます。フル GC の頻度は減りますが、古い世代のスペースが増加するため、フル GC が発生すると、実行に時間がかかります。

古い世代のスペースが削減されると、Full GC に必要な時間は短縮されますが、古い世代は生き残ったオブジェクトですぐに埋め尽くされ、Full GC の頻度が増加します。

したがって、Survivor の目的は、古い世代に送信されるオブジェクトの数を減らし、それによって Full GC の発生を減らすことです。 Survivor 事前スクリーニングにより、16 回のマイナー GC 後に新しい世代で存続できるオブジェクトのみが古い世代に送信されるようになります。

グループ 8: 参照カウントと到達可能性共有アルゴリズムの関係

参照カウント

オブジェクトに参照カウンターを追加します。オブジェクトがどこかで参照されるたびに、1 ずつ増加します。参照が失われると、1 ずつ減少します。カウントが 0 の場合、参照されなくなったことを示します。

  • 利点: 実装が簡単、判断効率が高い
  • 欠点: オブジェクト間の循環参照の問題を解決できません。オブジェクト A はオブジェクト B を参照し、オブジェクト B はオブジェクト A を参照します。

  1. パブリッククラスA {
  2. パブリックBb;
  3. }
  4. パブリッククラスB {
  5. パブリックC c;
  6. }
  7. パブリッククラスC {
  8. パブリックA a;
  9. }
  10. パブリッククラステスト{
  11.      
  12. プライベートvoidテスト(){
  13. A a = 新しいA();
  14. Bb = 新しいB();
  15. C c = 新しいC();
  16.          
  17. AB=B;
  18. bc = ;
  19. ca=a;
  20. }
  21. }

到達可能性分析アルゴリズム

オブジェクトを GC ルートに接続する参照チェーンがない場合、つまり GC ルートがオブジェクトに到達できない場合、オブジェクトは使用できないことが証明されます。

GC ルート タイプ:

Java スレッドでは、現在呼び出されているすべてのメソッドの型パラメータ、ローカル変数、一時値などを参照します。つまり、スタック フレームに関連するさまざまな参照です。現在ロードされているすべての Java クラス。 Java クラスの参照型静的変数。ランタイム定数プール内の参照型定数 (文字列またはクラス型)。 sun.jvm.hotspot.memory.Universe クラスなどの JVM 内部データ構造への参照。オブジェクトの wait() メソッドの呼び出しなど、同期に使用される監視オブジェクト。

グループ9: オブジェクトの参照型間の関係

  • 強い参照: User user=new User();これは私たちの開発で最もよく使用されるオブジェクト参照方法です。

機能: 一般的なコーディング Object obj = new Object() の obj は強い参照です。

キーワード new によって作成されたオブジェクトに関連付けられた参照は、強い参照です。

JVM のメモリ領域が不足すると、JVM は、強い参照を持つ「生き残った」オブジェクトを任意にリサイクルしてメモリ不足の問題を解決するのではなく、OutOfMemoryError ランタイム エラー (OOM) をスローしてプログラムを異常終了させます。

通常のオブジェクトの場合、他の参照関係がない場合、参照のスコープを超えるか、対応する (強い) 参照が明示的に null に割り当てられている限り、ガベージ コレクションの対象になります。具体的なリサイクルのタイミングは、ガベージ コレクション戦略によって異なります。

  • ソフト参照: SoftReference オブジェクト = new SoftReference (new Object ());

機能: ソフト参照は SoftReference クラスを通じて実装されます。ソフト参照の有効期間は、強参照の有効期間よりも短くなります。 JVM は、メモリが不足していると判断した場合にのみ、ソフト参照によって指されるオブジェクトの再利用を試みます。つまり、JVM は、OutOfMemoryError をスローする前に、ソフト参照によって指されるオブジェクトがクリーンアップされていることを確認します。ソフト参照は、参照キュー (ReferenceQueue) と組み合わせて使用​​できます。ソフト参照によって参照されるオブジェクトがガベージ コレクターによって再利用された場合、Java 仮想マシンは、ソフト参照をそれに関連付けられた参照キューに追加します。後で、ReferenceQueue の poll() メソッドを呼び出して、対象のオブジェクトがリサイクルされたかどうかを確認できます。キューが空の場合は null を返します。それ以外の場合は、メソッドはキュー内の前の Reference オブジェクトを返します。

アプリケーション シナリオ: ソフト参照は、メモリに敏感なキャッシュを実装するためによく使用されます。空きメモリが残っている場合は、一時的にキャッシュを保持しておき、メモリが不足したときにクリーンアップすることができます。これにより、キャッシュの使用中にメモリが枯渇することがなくなります。

  • 弱参照: WeakReference オブジェクト = new WeakReference (new Object(); は ThreadLocal で使用されます。

弱参照は WeakReference クラスを通じて実装されます。弱参照の有効期間はソフト参照の有効期間よりも短くなります。ガベージ コレクター スレッドが管轄下のメモリ領域をスキャンすると、弱参照を持つオブジェクトが見つかると、現在のメモリ領域が十分であるかどうかに関係なく、そのメモリが再利用されます。ガベージ コレクターは優先度の低いスレッドであるため、弱参照オブジェクトはすぐに回収されない可能性があります。

弱参照は参照キュー (ReferenceQueue) と組み合わせて使用​​できます。弱参照によって参照されるオブジェクトがガベージ コレクションされると、Java 仮想マシンは、それに関連付けられた参照キューに弱参照を追加します。アプリケーション シナリオ: 弱いアプリケーションは、メモリに敏感なキャッシュにも使用できます。

ファントム参照: ほとんど使用されません。ReferenceQueue、PhantomReference。

グループ 10: ガベージコレクションアルゴリズムの関係

マークアンドスイープアルゴリズム

最初のステップは、アクティブなオブジェクトを見つけることです。 GC プロセスは逆であり、GC ルートに従って到達可能なすべてのオブジェクトをトラバースすることを繰り返し強調してきました。このプロセスはマーキングと呼ばれます。

ステップ 2: 上記でマークされたオブジェクト以外のすべてをクリアします。

  • デメリット: マーキングとクリアは効率的ではなく、マーキングとクリア後に大量の不連続なメモリフラグメントが生成されます。

レプリケーションアルゴリズム

新世代で使用され、新世代はEden:S0:S1=8:1:1に分割され、後者の1:1が複製に使用されます。

1 つのメモリ ブロックが使い果たされると、残っているオブジェクトが別のブロックにコピーされ、使用済みのメモリ領域が一度にクリアされます。

通常、オブジェクトは新しい世代のエデン領域に割り当てられます。マイナー GC がまだ有効な場合、それらは S0 領域に割り当てられます。 S0 と S1 はオブジェクトを継続的にコピーします。デフォルトの最大オブジェクト生存期間は 15 です。新しい世代には連続したスペースがないため、大きなオブジェクトは古い世代に直接配置される場合があります。どのような使用法でも、新しい世代の 10% は空です。

デメリット: オブジェクトの生存率が高い場合、レプリケーションの効率が低くなり、メモリが浪費されます。

マークスイープアルゴリズム

その主なアイデアは、生き残ったすべてのオブジェクトを移動し、メモリ アドレスの順に並べ、終了メモリ アドレス以降のすべてのメモリをリサイクルすることです。ただし、これはあくまで理想的な状態であることに注意してください。オブジェクト間の参照関係は一般に非常に複雑であるため、ここでは具体的なアルゴリズムについては説明しません。効率の点では、一般的なソート アルゴリズムはコピー アルゴリズムよりも劣ることを理解する必要があります。このアルゴリズムはメモリの断片化とメモリの無駄を回避します。

残っているすべてのオブジェクトを一方の端に移動し、終了境界の外側のメモリを直接クリーンアップします。

上記の 3 つのアルゴリズムから判断すると、実際には絶対的に最良のリサイクル アルゴリズムは存在せず、最も適したアルゴリズムのみ存在します。

グループ 11: ガベージ コレクターはどのように関連していますか?

「新世代コレクター」: シリアル、ParNew、パラレル スカベンジ 「旧世代コレクター」: CMS、シリアル オールド、パラレル オールド

ホールヒープコレクター: G1、ZGC (時代と関係がないため、表には含まれていません)

この記事はWeChat公開アカウント「Java Backend Technology Full Stack」から転載したものです。以下のQRコードからフォローできます。この記事を転載する場合は、Java Backend Technology Full Stack パブリック アカウントにお問い合わせください。

<<:  テンセントは初めてオープンソースの10年の歴史を振り返り、オープンソースの理想と実践を組み合わせる道を確実に確立した。

>>:  2021年にクラウドコンピューティング業界を変える3つのトレンド

推薦する

外部リンク: 史上最も包括的な外部リンクの説明

インタールード: この記事はこの観光客のメッセージのために書かれました (luoli はあなたがそれ...

文化省の公式Weiboアカウントがネットユーザーから攻撃を受けた

10月16日、「文化部公式Weiboアカウント」として認証された文化部の青色公式Weiboアカウント...

企業は依然としてクラウド環境にセキュリティリスクを持ち込んでいる

組織がクラウドを選択する最大の理由の 1 つはセキュリティですが、クラウド セキュリティによって新た...

Vanclの考察:インターネットプロモーションを諦めることは、実は降伏すること

今年の「中国の声」を見ましたか?昨年の「中国の声」の熱心なファンであるシャオ・ルーさんは周りの同僚に...

リベートウェブサイトは、「既存ユーザーの維持」と「新規ユーザーの獲得」という2つのアプローチでユーザーを管理しています。

編集者注: 電子商取引は爆発的な成長期を過ぎました。依然として高い成長率を維持しているものの、小売業...

ストレージを改善する 5 つのマルチクラウド ユースケース

マルチクラウド ストレージ テクノロジーが主流になるにつれて、その使用事例は急速に増加しています。し...

WeChatミニゲームのソーシャル共有、乾癬に関するグループチャット?

ミニゲームは人気になりましたが、私のWeChatグループは完全に破壊されました。ミニゲームのソーシャ...

なぜ Baidu は 20 日以上経ってもウェブサイトの 3 ページしかインデックスしなかったのでしょうか?

多くの初心者は、検索エンジンに含まれない問題に悩まされています。誰もが初心者の頃にこの状況を経験した...

専門家になり、専門家を超えましょう。ブランドウェブサイトのコンテンツを作成する方法

「ブランドは1日で築かれるものではない。」 「私の理想のウェブサイトコンテンツスタイル(独自のサービ...

操作:Baidu Xiong Zhangアカウント認可TP、Xiong Zhangアカウント操作専用!

最近、百度は熊張昊の「春竹の子計画」を正式に開始しました。これは、高品質のコンテンツを持つ中小規模の...

成功するウェブサイトのための 5 つの SEO ステップ

ウェブサイトを構築した後、SEO の最適化は重要なステップですが、SEO を最も効果的に行うにはどう...

半年で870万UV。世界で最も急成長しているオンラインメディアはどのようにして誕生したのか?

今年 3 月に設立された Upworthy は、世界で最も急速に成長しているメディア企業です。従業員...

競合他社のウェブサイトのおかげで無敵になる

私は今年1月からウェブサイト開発に携わっています。主要キーワードのランキングは常に1位で、状況は比較...

コンテンツこそが王様であるという原則を守り、優れたコンテンツを開発する

コンテンツこそが王様という考え方は業界でますます受け入れられ、SEO の典型的な例とみなされるように...

SEO必読の新外部リンク方法と注意点

SEO に携わったことがある人なら誰でも、ウェブサイトが上位にランクインして掲載されるためには、優れ...