blog

JVMのメモリー領域

jdk1.8以降のバージョンは多少異なります プログラム・カウンタは、仮想マシンが実行しているバイナリ・バイトコードの行番号インジケータと考えることができる、メモリ空間の非常に小さな部分です。バイトコ...

Jul 13, 2020 · 4 min. read
シェア

ランタイムメモリ領域

java仮想マシンは、Javaプログラムの実行中に、管理するメモリをいくつかの異なるデータ領域に分割します。

jdk1.8

スレッドプライベートメモリ領域

スレッド共有メモリ領域のライフサイクルは、スレッドが作成されるときに作成され、スレッドが終了するときに破棄されます。

プログラムカウンタ

プログラム・カウンタは、仮想マシンが実行しているバイナリ・バイトコードの行番号インジケータと考えることができるメモリ空間の小さな断片です。バイトコードインタープリタは、プログラムカウンタの値を変更することによって、次に実行されるバイトコード命令を取得します。スレッドが Java コードを実行している場合、プログラム・カウンタには実行中のバイトコード命令のアドレスが記録されます。ネイティブ・メソッドの場合、プログラム・カウンタには null が記録されます。

Java仮想マシンスタック

仮想マシン・スタックは、Java メソッドが動作するメモリ・モデルを記述します。 各メソッドは実行中にスタック・フレームを作成し、ローカル変数テーブル、オペランド・スタック、動的接続、メソッド終了などの情報を格納するために使用されます。実行完了までの各メソッド呼び出しは、入力と終了のプロセスのスタック・フレームに対応します。ローカル変数テーブル: メソッド内で定義されたメソッドパラメータと変数を格納するための変数値格納空間のセットです。オペランドスタック: オペレーションスタックとも呼ばれ、バックイン・ファーストアウトのスタックです。 メソッドが実行を開始したばかりのときは、オペランドスタックはまだ空で、メソッドを実行する過程で、オペランドスタックに内容を書き込んだり、オペランドスタックから内容を取り出したりするあらゆる種類のバイトコード命令があり、これはスタックに入ったり出たりするプロセスに相当します。オペランド・スタックは、次に処理されるデータを格納するために使用されるレジスタに相当するオペレーティング・システムです。仮想マシンはVMスタックをワークスペースとして使用します。ほとんどの命令はここでデータをポップし、計算を実行し、その結果をVMスタックに押し戻し、ローカル変数テーブルに格納します。概念モデルでは、2 つのスタック・フレームは完全に独立していますが、実際には、2 つのスタック・フレームが部分的に重なり合うように最適化され、追加のパラメータ・コピーを必要とせずに、データの共通部分を使用してメソッド呼び出しを行うことができます。動的接続性:各スタックフレームは、メソッド呼び出し時の動的接続性をサポートするために保持される実行時定数プールに、スタックフレームが属するメソッドへの参照を含みます。この領域では、java 仮想マシンは 2 つの例外条件を指定します。スレッドが仮想マシンが許容する以上のスタック深度を要求すると、StackOverflowError 例外がスローされ、仮想マシンを動的に拡張できる場合、拡張中に十分なメモリを要求できないと OutOfMemoryErrory 例外がスローされます。スタック・フレームは、メソッド実行時の基本的なデータ構造です。

ローカルメソッドスタック

ネイティブメソッドスタックと仮想マシンスタックはよく似た役割を果たしますが、違いは、仮想マシンスタックは仮想マシンがJavaメソッドサービスを実行するためのもので、ネイティブメソッドスタックはネイティブメソッドサービスを実行するためのものです。

スレッドが共有するメモリ領域

Java

ほとんどのアプリケーションでは、ヒープはJava仮想マシンによって管理される最大のメモリで、Java仮想マシンが起動したときに作成されます。このメモリ領域の唯一の目的は、オブジェクト・インスタンスを保持することです。配列も含めて、ここにメモリが割り当てられます。Javaヒープは、ごみ収集器によって管理される主な領域なので、GCヒープとも呼ばれます。Java仮想マシンによると、Javaヒープは物理的に非連続なメモリ空間であり、実装で拡張可能に設定できます。インスタンス割り当てのためにヒープにメモリがなく、ヒープが拡張可能でない場合、OutOfMemoryError例外がスローされます。

Java

メソッド領域は、ヒープと同様に、個々のスレッドによって共有されるメモリの領域であり、クラス情報、定数、静的変数、および仮想マシンによってロードされた即時のコンパイラでコンパイルされたコードデータを格納するために使用されます。Java仮想マシンの仕様では、メソッド領域はヒープの論理的な部分として記述されていますが、Javaヒープと区別するためにNon-Heapという別名があります。Javaのメソッド領域は、永久世代としても知られています JDK1.8永久世代は、サイズが次のパラメータによって設定されているときに削除されていません。

-XX:PermSize=N //メソッド領域の初期サイズ
-XX:MaxPermSize=N //メソッド領域の最大サイズは、それを超えるとOutOfMemoryError例外がスローされる。:java.lang.OutOfMemoryError: PermGen

jdk 1.8以降、メソッド領域は完全に削除され、直接メモリを使用するメタ空間に置き換えられました。

-XX:MetaspaceSize=N //メタスペースの初期設定
-XX:MaxMetaspaceSize=N //メタスペースの最大サイズを設定する

パーマネント生成との大きな違いは、サイズを指定しないと、仮想マシンはより多くのクラスが作成されるにつれて、利用可能なシステム・メモリをすべて使い切ってしまうことです。

なぜメソッドエリアではなくメタスペースを使うのですか?

実行時定数プール

クラス・ファイルには、クラスのバージョン、フィールド、メソッド、インターフェイス、その他の記述情報と、定数プールの情報が含まれています。JDK1.7以降のバージョンのJVMでは、実行時定数プールをメソッド・エリアから移動し、Javaヒープに実行時定数プールを格納するエリアを作成しました。

Read next

ブロックチェーンの会計基準は業界全体で求められており、いくつかの基準を必要とするだろう。

"現在のICO市場の低迷の大きな原因の一つは、ブロックチェーン業界における基準の欠如であり、そのために多くの伝統的な資本が参入できなかったり、あえて参入しようとしなかったりしたことです。"丁永強氏はChaintechに対し、「会計基準の導入は、投資家にプロジェクトに対するより明確な洞察を与えるだけでなく、今や多くのプロジェクト所有者、取引所、さらにはト

Jul 13, 2020 · 2 min read