序文
私はJVMメモリエリアの分割に関する記事を書きましたが、昨日、Ant Financialのインタビューを受けました。 JVM関連のコンテンツについて尋ね、JVMメモリ領域の分割について説明しました。この部分はかなり良かったが、後で私はJavaの文字列がどこに保存されているかを尋ねた。文字列は不変の量であり、一定のプールに保存する必要があることを思い出しました。しかし、後で私は新しい文字列をどこに配置する必要があるかを尋ねました。これはヒープに配置する必要があります。後で、文字列参照がどこに配置されたかを尋ねました。当時、私は愚かで、それらも山に置かれたと言った。次に、要約します。基本型変数データとオブジェクト参照がスタックに配置され、オブジェクト自体がヒープに配置され、明示的な文字列定数が定数プールに配置され、ストリングオブジェクトがヒープに配置されます。
一定のプールの説明
一定のプールは以前にメソッドエリアに配置されていました。つまり、永久世代にあり、JDK7から始まる山に移動しました。この変更は、OracleのリリースバージョンのJDK 7ノートで扱われている**重要なRFEから見ることができます。
エリア:Hotspotsynopsis:JDK 7では、内部文字列はJava Heapの永続的な世代では割り当てられなくなりますが、代わりに、アプリケーションによって作成された他のオブジェクトとともに、Javaヒープの主要な部分(幼い世代と古い世代として知られています)で割り当てられます。この変更により、メインのJavaヒープに存在するデータが増え、恒久的な発電でのデータが少なくなり、ヒープサイズを調整する必要がある場合があります。ほとんどのアプリケーションでは、この変更によりヒープ使用量の比較的小さな違いのみが表示されますが、多くのクラスをロードするか、string.intern()メソッドを使用する多くのアプリケーションがより大きな違いが表示されます。RFE:6962931
文字列メモリの位置説明
1。明示的な文字列定数
文字列a = "holten"; string b = "holten";
•最初の文の後、holtenの値を持つ文字列オブジェクトが定数プールに作成されます。
•2番目の文が実行されると、定数プールにホルテンがあるため、新しい文字列オブジェクトは作成されなくなります。
•この時点で、文字列への参照は仮想マシンスタックにあります。
1.ストリングオブジェクト
文字列a = new String( "holtenobj"); string b = new String( "Holtenobj");
•クラスがロードされると、Holtenobjの値を持つ文字列オブジェクトが定数プールに作成されます。最初の文が実行されると、新しい文字列( "Holtenobj")オブジェクトがヒープに作成されます。
•2番目の文が実行されると、Holtenobjが定数プールに存在するため、新しい文字列オブジェクトは作成されなくなり、新しい文字列(「Holtenobj」)オブジェクトがヒープに直接作成されます。
確認する
/*** 2016/8/16にholten.gaoによって作成されました。 */public class main {public static void main(string [] args){string str1 = "gao xiaotian"; string str2 = "gao xiaotian"; System.out.println(str1 == str2); // true string str3 = new String( "gao datian"); string str4 = new String( "gao datian"); System.out.println(str3 == str4); // false}}返品結果:
TrueFalse
上記の記事は、Javaの文字列メモリロケーションの詳細な説明に基づいています。それは私があなたと共有するすべてのコンテンツです。参照を提供できることを願っています。wulin.comをもっとサポートできることを願っています。