これは、静的配列は Java メモリにどのように保存されますか?へのフォローアップの質問です。.
そのため、C/C++ のグローバル変数はメモリの静的データ セグメントに格納されます。しかし、Java/C++ の静的クラス変数はどうでしょうか?
プログラムの実行中に参照されるクラスの種類と数がわからないため (リフレクションのため)、静的データ セグメントにすることはできません。それは意味がないので、間違いなくスタックではありません。それをヒープに格納するのもちょっと難しいです。
これは、静的配列は Java メモリにどのように保存されますか?へのフォローアップの質問です。.
そのため、C/C++ のグローバル変数はメモリの静的データ セグメントに格納されます。しかし、Java/C++ の静的クラス変数はどうでしょうか?
プログラムの実行中に参照されるクラスの種類と数がわからないため (リフレクションのため)、静的データ セグメントにすることはできません。それは意味がないので、間違いなくスタックではありません。それをヒープに格納するのもちょっと難しいです。
Java では、低レベルでは、クラスの静的変数は実際に他のすべてのクラス メタデータと共にヒープに格納されます。Java にとってはグローバルのように見えますが、JVM の低レベルのヒープ管理ルーチンにとっては動的データです (ただし、GC の効率を向上させるために少し特別に扱われることがありますが、それらは寿命が長い可能性があるためです)。結局のところ、クラスローダーを参照解除することで、クラスをアンロードできます。
C と同じかどうかについてはmalloc()
、そうではありません。ほとんどの JVM は、低レベルでヒープを制御します。OS からメモリのチャンクを取得し、それを自分で分割します。そのため、静的データを含むほとんどの Java データは、malloc ヒープではなく、JVM によって管理される別のヒープに格納されます。
Java には、クラス メタデータを配置する「永続的な」ヒープがあります。したがって、静的値の「ルート」は永続ヒープにあります。値は参照値 (クラス オブジェクト) であり、値自体は通常のヒープにあります。
静的変数はヒープに保存されません。それらはデータ セグメントの一部です。ローカル変数は - スタックに格納されます。インスタンス変数は - ヒープに格納されます。クラス変数 (静的) は - データ セグメントに格納されます。これらの変数は、そのクラスのすべてのオブジェクトで共有されます。最終的なマシンと同等の Java コードは、コード/テキスト セグメントに格納されます。