Java の静的メンバー変数はヒープ メモリまたはスタック メモリに配置されますか?

高洛峰
リリース: 2016-10-13 15:25:49
オリジナル
2240 人が閲覧しました

ヒープ領域:

1. すべてのオブジェクトが保存され、各オブジェクトには対応するクラスに関する情報が含まれます。 (クラスの目的は操作命令を取得することです)
2. JVM にはすべてのスレッドで共有されるヒープ領域 (ヒープ) が 1 つだけあり、基本型とオブジェクト参照はヒープに格納されず、オブジェクト自体のみが格納されます。
1. 各スレッドにはスタック領域が含まれます。オブジェクトはすべてスタック領域に格納されます。タイプとオブジェクト参照) は private であり、他のスタックにはアクセスできません。
3. スタックは基本型変数領域、実行環境コンテキスト、演算命令領域(ストレージ演算命令)の3つに分かれています。
メソッド領域:
1. ヒープと同様に静的領域とも呼ばれ、すべてのスレッドによって共有されます。メソッド領域には、すべてのクラス変数と静的変数が含まれます。


2. メソッド領域には、クラス変数や静的変数など、プログラム全体で常に一意な要素が含まれます。


プログラムの実行中に、データをどこに保存するかを知っておくとよいでしょう。内部割り当てには特に注意してください。 データを保存できる場所は 6 つあります。


1.これは、他のすべての保存とは異なる場所 (プロセッサー内) に配置されているため、最も高速な保存領域です。ただし、レジスタの数は非常に限られているため、レジスタは必要に応じてコンパイラによって割り当てられます。これを直接制御することはできず、プログラム内でレジスタの存在の痕跡を見つけることは不可能です。

2. 積み重ねる。通常の RAM (ランダム アクセス メモリ) 領域に常駐します。ただし、処理の直接サポートは、その「スタック ポインター」を通じて利用できます。スタック ポインタを下に移動すると新しいメモリが作成され、上に移動するとそのメモリが解放されます。これは、レジスタに次いで 2 番目にデータを保存する非常に高速かつ効率的な方法です。プログラムを作成するとき、Java コンパイラーは、スタックに保存されているすべてのデータの「長さ」と「存在時間」を正確に把握する必要があります。これは、ポインタを上下に移動させるための適切なコードを生成する必要があるためです。この制限は間違いなくプログラムの柔軟性に影響を与えるため、一部の Java データ (特にオブジェクト ハンドル) はスタックに保存されますが、Java オブジェクトはスタックに配置されません。

3. ヒープ。 Java オブジェクトが保存される汎用メモリ プール (RAM 領域でもあります)。スタックとは異なります。「メモリ ヒープ」または「ヒープ」の最も魅力的な点は、コンパイラーがヒープから割り当てる記憶域スペースの量や、保存されたデータがヒープ内に留まる期間を知る必要がないことです。したがって、ヒープを使用してデータを保存する際の柔軟性が向上します。オブジェクトを作成する必要がある場合は、 new コマンドを使用して対応するコードをコンパイルするだけです。これらのコードが実行されると、データは自動的にヒープに保存されます。もちろん、この柔軟性を実現するには、一定の代償を支払う必要があります。ヒープ
4 にストレージ領域を割り当てるのに時間がかかります。ここでの「静的」とは「固定された位置にある」ことを意味します。プログラムの実行中、静的に保存されたデータはいつでも呼び出されるのを待機しています。 static キーワードを使用すると、オブジェクトの特定の要素が静的であることを示すことができます。ただし、Java オブジェクト自体が静的ストレージ領域に配置されることはありません。
5. 一定のストレージ。定数値は通常、プログラム コード内に直接配置されます。そうすれば安全です。一部の定数は決して変更されないため、厳密に保護する必要があるため、読み取り専用メモリ (ROM) に配置することを検討してください。
6. 非RAMストレージ。データがプログラムから完全に独立している場合、プログラムが実行されておらず、プログラムの制御外にあるときにもデータが存在する可能性があります。最も重要な例の 2 つは、「ストリーミング オブジェクト」と「固定オブジェクト」です。ストリーミング オブジェクトの場合、オブジェクトはバイト ストリームに変換され、通常は別のマシンに送信されます。一方、固定オブジェクトの場合、オブジェクトはディスクに保存されます。プログラムが終了しても、その状態は維持されます。この種のデータ ストレージで特に便利な方法は、データ ストレージが他のメディアに存在でき、必要に応じて通常の RAM ベースのオブジェクトに復元できることです。



まず第一に、Java には静的変数の概念がありません。Java には静的メンバー変数しかありません。メソッド内で static int i = 0 を定義できます。それはクラスのプロパティです。彼がそれをどこに置いたかについては?私が上の階で話しているのは、静的エリアのことです。そのような訳があるかどうかは知りません。しかし、JVM を深く掘り下げると、JVM はメソッド領域に変換されます。仮想マシンのアーキテクチャ: ヒープ、メソッド領域、ローカル メソッド スタック、PC レジスタ。メソッド領域にはクラスのテンプレートが保存され、ヒープにはクラスのインスタンスが保持されます。スタックは通常、関数の計算に使用されます。コンピューターの基本に関する本を探せばすぐにわかります。関数の実行後、スタック上のデータは保存されません。そのため、ローカル変数は毎回同じになります。追加しても次回実行時も同じです。


ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!