Java仮想マシンメモリモジュール

前に書く:

この記事は、Java Virtual Machine(Zhou Zhiming)の第3版のリーディングノートを深く理解したものであり、写真は電子ブックからのものです。

JavaとC ++の間には、動的なメモリ割り当てとガベージコレクションテクノロジーに囲まれた高い壁があります。壁の外の人は入りたがりますが、壁の内側の人はそれを思いつきます。

1概要

「Java仮想マシン仕様」によると、Java仮想マシンが管理するメモリには、次の領域が含まれています。

Java Virtual Machine Third Editionについて図2-1

1.1プログラムカウンタ(プログラムカウンタレジスタ)

プログラムカウンタは小さなメモリ空間であり、現在のスレッドによって実行されるバイトコードの行番号インジケータと見なすことができます。

1.2 Java仮想マシンスタック(Java仮想マシンスタック)

各メソッドが実行されると、Java仮想マシンは、ローカル変数、オペランドスタック、動的接続、メソッド出口、およびその他の情報を格納するためのスタックフレーム(Stack Frame)を同時に作成します。

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

ローカルメソッドスタックは仮想マシンスタックの役割に似ていますが、仮想マシンスタックがJavaメソッドを実行し、ローカルメソッドスタックがネイティブメソッドを使用して仮想マシンにサービスを提供するという違いがあります。

1.4 Javaコンパイル(Javaヒープ)

Javaヒープは、仮想マシンが管理する最大のメモリです。Javaの世界では、ほとんどすべてのオブジェクトインスタンスがヒープに割り当てられます。「Java仮想マシン仕様」でのJavaヒープの説明は次のとおりです。「すべてのオブジェクトインスタンスと配列はヒープに割り当てられる必要があります(ヒープはランタイムデータです)すべてのクラスインスタンスと配列のメモリが割り当てられる領域) "ですが、リアルタイムコンパイルテクノロジーの進歩により、特にエスケープ分析テクノロジーはますます強力になり、スタック上での割り当てです。スカラー置換最適化は、オブジェクトインスタンスがすべてヒープに割り当てられているわけではないため、絶対的ではありませんあまりにも。

Javaヒープはガベージコレクターによって管理されるメモリ領域であるため、「GCヒープ」と呼ばれることもあり、ヒープのサイズはパラメーター-Xmxおよび-Xmsによって設定できます。

1.5メソッド領域

これは、タイプ情報、定数、静的変数、リアルタイムコンパイラによってコンパイルされたコードキャッシュなどのデータを格納するために使用され、仮想マシンによって混合されます。

1.6ランタイム定数プール

ランタイム定数プール(ランタイム定数プール)はメソッド領域の一部です。クラスファイルのクラスバージョン、フィールド、メソッド、インターフェイス、およびその他の説明情報に加えて、コンパイル中に生成されるさまざまなリテラルおよびシンボル参照を格納するために使用される定数プールテーブル(定数プールテーブル)もあります。クラスがロードされた後、コンテンツはメソッド領域の実行時定数プールに保存されます。

1.7ダイレクトメモリ

物理マシンのメモリは、「Java仮想マシン仕様」で定義されているメモリ領域に属していません。

2 HotSpot仮想マシンオブジェクトの探索

2.1関連する概念

ポインターの衝突(Bump The Pointer):Javaヒープ内のメモリーが完全に規則的であると仮定すると、使用されているすべてのメモリーが片側に配置され、空きメモリーが反対側に配置され、境界点のインジケーターとしてポインターが中央に配置されます、割り当てられたメモリは、オブジェクトのサイズと等しい距離だけポインタを空き領域に移動するだけです。この割り当て方法は「ポインタ衝突」と呼ばれます。

空きリスト:Javaヒープ内のメモリが通常のものではない場合、使用済みメモリと空きメモリは相互にインターリーブされているため、単純にポインタの衝突を実行する方法はなく、仮想マシンはリストを維持する必要があります、使用可能なメモリブロックを記録し、割り当て中にオブジェクトインスタンスに割り当てるのに十分なスペースをリストから見つけ、リストのレコードを更新します。この割り当て方法は「フリーリスト」(Free List)と呼ばれます。

割り当て方法の選択は、Javaヒープが通常かどうかによって決まり、Javaヒープが通常かどうかは、使用されるガベージコレクターがスペース圧縮(コンパクト)の容量を持っているかどうかによって決まります。

HotSpot仮想マシンでは、ヒープメモリ内のオブジェクトのレイアウトは、オブジェクトヘッダー(Header)、インスタンスデータ(Instance Data)、および配置パディング(Padding)の3つの部分に分けることができます。

オブジェクトヘッダー(Header):オブジェクトヘッダーには、2種類の情報が含まれます。最初のタイプは、ハッシュコード、GC生成経過時間、ロックステータスフラグ、スレッドが保持しているロック、バイアススレッドID、バイアスタイムなど、オブジェクト自体のランタイムデータを格納します「Mark Word」とも呼ばれるPokeなど。2番目のタイプはタイプポインターであり、このオブジェクトがそのクラスのインスタンスであることを確認するために、このポインター仮想マシンを介したタイプメタデータへのポインターです。

インスタンスデータ:オブジェクトが実際に保存する有効な情報。

アラインメントのパディング(パディング)オプション、プレースホルダーの役割。

 

 

 

おすすめ

転載: www.cnblogs.com/w-m-m/p/12733116.html