JVM のメモリ配分と機能を 1 つの記事で理解する

JVM のメモリ配分と機能を 1 つの記事で理解する

[[403896]]

この記事は、bingfeng が執筆した WeChat パブリックアカウント「プログラマーの成長」から転載したものです。この記事を転載する場合は、プログラマーの成長公開アカウントまでご連絡ください。

Java メモリ領域の紹介を始める前に、後で紹介するときに参照できるように、メモリ領域の図を掲載しておきます。

「注意」: この記事は JDK8 に基づいています。

Java メモリ領域グラフ

プログラムカウンタ

まず、スレッドプライベートです。コードの行番号インジケーターとも呼ばれます。バイトコード インタープリターは、プログラム カウンターの位置を変更することで、次に実行されるコード行を決定します。 OOMはありません。

スレッドが Java メソッドを実行している場合、実行中の仮想マシン バイトコード命令のアドレスを記録します。ネイティブ メソッドの場合、その値は空になります。

Java 仮想マシン スタック

また、これはスレッドプライベートであり、その宣言ライフサイクルはスレッドのライフサイクルと一致しています。各スレッドが作成されると、スタック フレームを 1 つずつ格納する仮想マシン スタックが作成されます。各スタック フレームはメソッド呼び出しに対応します。仮想マシン スタックがスタック フレームを 1 つずつ格納することがわかったので、仮想マシン スタックに何が格納されているかを推測するのは難しくありません。

Java 仮想マシン スタックには OOM があります。スレッドが要求したスタックの深さが仮想マシン スタックの深さよりも大きい場合、または仮想マシン スタックが動的に拡張できる場合、およびスタックの拡張時に十分なメモリを要求できない場合、OOM がスローされます。

  • 「仮想マシンスタックの内部構造」:

仮想マシンスタックの内部構造

  • 「ローカル変数テーブル」:

主にメソッドパラメータ、すべての基本型データとオブジェクトアドレス、および戻りアドレス型(リターンアドレス)を格納します。変数スロットを最小のストレージ単位として使用します。 Java 仮想マシンでは、変数スロットが占めるメモリ領域の量を指定しませんが、変数スロットには 32 ビット以内のデータ型を格納できると規定しています。保存するデータ型が long や double など 32 ビットを超える場合は、保存に 2 つの変数スロットが使用されます。

  • オペランドスタック:

オペランド スタックは先入れ後出しのオペランド スタックです。メソッドの実行が開始されると、新しいスタック フレームが作成されます。このメソッドのオペランド スタックは空です。主に計算処理の中間結果を保存したり、計算処理中の変数の一時保存スペースとして使用されます。呼び出されたメソッドに戻り値がある場合、戻り値は現在のスタック フレームのオペランド スタックにプッシュされます。オペランド スタックはインデックスによってデータにアクセスするのではなく、プッシュ操作とポップ操作によってデータにアクセスします。

  • ダイナミックリンク:

簡単に言えば、メソッドへの参照はスタック フレームに格納されます。メソッドが実行されると、この参照を使用してランタイム定数プール内のメソッドを見つけることができます。

動的リンクの役割は、これらのメソッドへのシンボリック参照を呼び出しメソッドへの直接参照に変換することです。

  • 「メソッド戻りアドレス」:

つまり、メソッドの実行が完了した後、次に実行されるコード位置の値、つまりプログラム カウンターの値が返されます。

メソッドの通常の実行と終了に加えて、例外によりメソッドが終了する状況もあります。この場合、値は返されません。スローされた例外については、スタック フレームに記録されませんが、例外テーブルに記録されます。

ネイティブメソッドスタック

Java 仮想マシン スタックは、仮想マシンが Java メソッドを実行するために使用され、ネイティブ メソッド スタックは、仮想マシンが使用するネイティブ メソッドに使用されます。たとえば、JVM には C 言語で記述されたメソッドが多数あり、それらを実行するにはローカル メソッド スタックが必要です。

Javaヒープ

Java ヒープは、仮想マシン内で最大のメモリ空間です。これはすべてのスレッドで共有され、仮想マシンの起動時に作成されます。その唯一の目的は、オブジェクト インスタンスを保存することです。

面接で質問された場合、すべてのオブジェクト インスタンスにヒープ内のメモリが割り当てられますか?現時点では「いいえ」と答えなければなりません。

ジャストインタイムコンパイル技術、特にますます強力になるエスケープ解析技術の発展と進歩により、スタック割り当てや変数置換などの最適化手法により、インスタンスを「ヒープ内のみ」に割り当てることが絶対ではなくなりました。

Java ヒープはガベージ コレクションの主な領域です。 Java ヒープには、新しい世代、古い世代、永続的な世代などが頻繁に出現します。ここで注意すべき点は、これらは Java ヒープの物理メモリ レイアウトではないということです。ガベージコレクターとして分割されたメモリレイアウトです。

方法領域

メソッド領域もスレッドによって共有される領域です。主に、仮想マシンによってロードされたジャストインタイムコンパイラによってコンパイルされた型情報、定数、静的変数、コードキャッシュなどのデータを格納するために使用されます。

メソッド領域は、主に型のアンロードと定数プールのリサイクルのために、ガベージ コレクターによって再利用できます。

メソッド領域も OOM を引き起こす可能性があります。メソッド領域が新しいメモリ割り当て要件を満たすことができない場合、OutOfMemoryError 例外がスローされます。

ランタイム定数プール

ランタイム定数プールはメソッド領域の一部です。クラス ファイルには、クラス バージョン、フィールド、メソッド、インターフェイスなどの情報に加えて、コンパイル中に生成されるさまざまなリテラルとシンボル参照を格納するために使用される定数プール テーブルも含まれています。

動的リンク部分が理解できない場合は、実行中の定数プールを読んでから戻って、よりよく理解できるかどうかを確認してください。

<<:  フレームワーク: 分散一貫性ソリューション

>>:  クラウドコンピューティングの謎を解く

推薦する

ガートナー:世界のパブリッククラウドのエンドユーザー支出は2022年に5,000億ドルに近づく

ガートナーの最新予測によると、パブリッククラウドサービスに対する世界のエンドユーザー支出は、2021...

今年の新しいクラウドコンピューティング市場はインターネットケーブルに依存している

[[333922]]やり方を知るよりも、買い方を知る方が良いです。この格言はテクノロジー界の巨人たち...

losangelesvps: 40% 割引コード、ロサンゼルス VPS、1Gbps 帯域幅、無制限トラフィック、Windows 付き

losangelesvps が HostCat にメッセージを送信しました: 公式が HostCat...

結婚式を葬式に変えたヴァッティのワールドカップの巧妙なマーケティングは、血なまぐさい教訓となった

2018年最もホットなプロジェクト:テレマーケティングロボットがあなたの参加を待っていますワールドカ...

企業ウェブサイト最適化の4つのステップについての簡単な説明

企業ウェブサイトの最適化は人々の間で話題になっています。ほとんどの SEO 担当者がこの作業を行って...

quickclickhosting: 年間 5 ドル、512M メモリ/20g SSD/1IPv4/480Gbps の高防御

quickclickhosting は 2011 年に英国ロンドンで設立され、企業として運営されてい...

Python エンベロープを使用してメールと添付ファイルを送信する

昨年、私は smtplib を使用して電子メールを送信する方法についての記事を書きましたが、友人から...

クラウド コンピューティング業界は「ソフト パワー」競争の時代に突入しました。セキュリティを勝ち取る者は世界を勝ち取る

近年、政府の推進と市場の需要という二重の影響により、わが国ではクラウド コンピューティング業界の発展...

ローカライズされたオンラインストアマーケティングの長所と短所の簡単な分析

販売者が初めて店舗をオープンする場合、チームの運営経験不足によりユーザーエクスペリエンス、物流、支払...

インターネット製品を核としたサービスデザインでユーザー認知を獲得する方法

現在のインターネット製品は急速に発展しており、実践者は製品のあらゆる側面を絶えず深く掘り下げています...

「フェイスブックの資金調達と上場、ネットが急騰」が微博ユーザーの間で論争を巻き起こす

【金融ニュース:フェイスブックのIPO】世界最大のソーシャルネットワーキングサイト、フェイスブックは...

ハイブリッドクラウドはビジネスの俊敏性を実現するための鍵

Nutanix は 2009 年の設立以来、IT 意思決定者のニーズに合わせて会社を進化させてきたこ...

クラウド コンピューティングでビッグ データを変換する 4 つのステップ

今日の企業は、顧客に一貫して価値の高い体験を提供しなければ、顧客を失うことになります。彼らはビッグデ...

草の根ウェブマスターがQQプラットフォームを合理的に利用してサイトを宣伝する方法をまとめます。

名前が示すように、草の根ウェブマスターは、インターネットの草の根レベルで懸命に働くウェブマスターです...

電子書籍を宣伝する方法

今日、いくつかのQQグループで共有されているPDFファイルを見つけたので、ダウンロードして見てみまし...