[4] Javaランタイムデータ領域

最近、面接の質問をいくつか見ていて、Javaの基礎となる変数メモリの割り当てについて完全に理解していないことがわかったので、インターネットで情報を検索し、他の多くの人のブログを読んだので、それを整理してあなたとそれを共有しました:

 

ヒープ内のJava仮想マシンの自動ガベージコレクション:

参照変数は通常の変数であり、定義時にスタックに割り当てられます。参照変数は、プログラムがスコープ外で実行された後に解放されます。配列とオブジェクト自体はヒープに割り当てられます。プログラムが、newを使用して配列またはオブジェクトを生成するステートメントが配置されているコードブロックの外で実行された場合でも、配列とオブジェクト自体が占有するメモリは解放され、参照変数がない場合、配列とオブジェクトは参照されません。ガベージになると使用できなくなりますが、メモリスペースを占有し、ガベージコレクターによって取得(解放)されます。その後の不確定な時間。これは、Javaがより多くのメモリを使用する理由でもあります。

 

スタックに格納されているデータは、同じスレッドで共有できます。

int a = 3; int b = 3;コンパイラが最初にinta = 3を処理し、最初にスタック内の変数aへの参照を作成し、次にリテラル値が3のアドレスを検索するとします。見つかりませんでした。、アドレスを開いてリテラル値3を格納してから、aをアドレス3にポイントします。次に、int b = 3を処理します。bの参照変数を作成した後、スタックにはすでにリテラル値3が存在するため、bはアドレス3を直接指します。このように、aとbの両方が同時に3を指す状況があります。この種のリテラル参照は、クラスオブジェクトの参照とは異なることに特に注意してください。2つのクラスオブジェクトの参照が同時にオブジェクトを指していると仮定すると、オブジェクト参照変数がこのオブジェクトの内部状態を変更すると、他のオブジェクト参照変数はすぐにこの変更を反映します。逆に、リテラル値への参照を介してその値を変更しても、このリテラル値への別の参照の値も変更されません。上記の例のように、aとbの値を定義した後、a = 4とすると、bは4に等しくなりませんが、3に等しくなります。コンパイラー内で、a = 4;が検出されると、スタックにリテラル値4があるかどうかを再度検索します。存在しない場合は、アドレスを再度開いて値4;が既に存在する場合は、このアドレスを直接指します。したがって、aの値の変更はbの値に影響を与えません。

 

包装の自動梱包:

例:

整数c = 3;          

整数d = 3;

自動ボクシングでは、valueOf(int i)メソッドを呼び出します。intを整数に変換する際のルールがあります。intの値が-128-127の場合、返されるのは新しいIntegerオブジェクトではなく、ヒープにキャッシュされたIntegerオブジェクトです(このように理解できますが、システムは整数配列に-128から127までの整数をキャッシュしました。intを整数オブジェクトに変換する場合は、最初にキャッシュに移動して見つけます。見つかった場合は、参照が直接返されます。 。それだけです。新しいものを作成する必要はありません)-128-127でない場合は、新しいIntegerオブジェクトが返されます。

さらに、FloatとDoubleを除く他のパッケージタイプはキャッシュを実装します。    

 

文字列定数プール:

String ss3 = newString( "china");まず、定数プールに中国の文字列があるかどうかを確認します。ない場合は、定数プールに文字列オブジェクトを作成してから、ヒープの定数プールに「china」オブジェクトを作成します。コピーオブジェクト。したがって、2つのオブジェクトが作成される可能性があります。

String str1 = "abc"; String str2 = "ab"; String str3 = str2 + "c"; str1 == str3はfalseです。Stringstr3= str2 + "c"には変数が含まれるためです(nullを含むすべての定数ではありません)。新しいオブジェクトが生成されます。その内部実装では、最初にヒープ内にStringBuilderを作成し、次にappend(str2)、append( "c");、次にstr3にtoString()によって返されたオブジェクトを参照させます。

等しい文字列の場合、定数プールには常に1つのコピーのみがあり、ヒープには複数のコピーがあります。

 

文字列intern()メソッド:

文字列のintern()メソッドは、定数プールに等しい文字列があるかどうかを検出します。存在する場合は、文字列への参照を返します。存在しない場合は、独自の文字列を定数プールに追加します。

ご自身の理解に多少のずれがあるかもしれませんが、間違いがありましたらご指摘いただければ幸いです。

 

おすすめ

転載: blog.csdn.net/Jack_PJ/article/details/80545341