10

インターンされた文字列が永続的な世代領域に格納されると言うとき、同じことが文字列リテラルにも当てはまりますか? それとも、inter() によってインターンされた文字列のみですか?

実際、ブログの投稿では通常、文字列プールには文字列オブジェクトへの参照が含まれているが、実際の文字列オブジェクトはheapのどこかにあると言われています。また、永久世代がヒープ内にあるか、ヒープ外にあるかについても非常に混乱しています。(私は jcosole を使用しました。これは、ヒープとは異なる永続的な世代を示しています。多くの投稿はヒープの一部としてそれを言い、多くはそれが異なると言っています)

編集: また、私が走ったとき:

public class stringtest2{
  public static void main(String args[]){
    int i=0;
    List<String> list=new ArrayList<String>();
    while(true){
      String s="hello"+i;
      String s1=i+"hello";
      String s2=i+"hello"+i;
      System.out.println(s);
      s.intern();

      s1.intern();
      s2.intern();
      list.add(s);
      list.add(s1);
      list.add(s2);
      i++;
    }
  }
}

私は期待していましたがJava.lang.OutOfMemoryError: PermGen space、私は得ました:

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
        at java.util.Arrays.copyOf(Arrays.java:2760)
        at java.util.Arrays.copyOf(Arrays.java:2734)
        at java.util.ArrayList.ensureCapacity(ArrayList.java:167)
        at java.util.ArrayList.add(ArrayList.java:351)
        at stringtest2.main(stringtest2.java:20)

そうじゃないかなJava.lang.OutOfMemoryError: PermGen space

4

3 に答える 3

6

インターンされた文字列が永続的な世代領域に格納されると言うとき、同じことが文字列リテラルにも当てはまりますか?

リテラル文字列はインターンされます。そうです、Java 6-.

Java 7 以降、インターンされた文字列は永続的な世代に保存されなくなりました。これらは、作成する他のオブジェクトと同様に、ヒープの主要部分に格納されます。

Java.lang.OutOfMemoryError: PermGen space ではないはずです

発生する例外は、ヒープ上に存在する配列の作成が原因です。「permgen メモリ不足」エラーを発生させるには、list.add()行を削除してみてください。ただし、インターンされた文字列はガベージ コレクトされる可能性があるため、それを行っても期待どおりの例外は発生しないことに注意してください。

RFE 6962931 を参照:

JDK 7 では、インターンされた文字列は、Java ヒープの永続的な世代に割り当てられなくなりましたが、代わりに、アプリケーションによって作成された他のオブジェクトと共に、Java ヒープの主要部分 (若い世代と古い世代として知られています) に割り当てられます。 . この変更により、メインの Java ヒープに存在するデータが増え、永続世代のデータが少なくなるため、ヒープ サイズの調整が必要になる場合があります。ほとんどのアプリケーションでは、この変更によるヒープ使用量の違いは比較的小さくなりますが、多くのクラスをロードしたり String.intern() メソッドを頻繁に使用する大規模なアプリケーションでは、より大きな違いが見られます。

于 2012-11-14T11:35:59.137 に答える
2

StringJavaDocで説明されているように、すべての String リテラルは自動的にインターンされます。

すべてのリテラル文字列と文字列値の定数式はインターンされます。

手動でインターンする文字列と文字列リテラルの間で動作が一貫していると思います。

于 2012-11-14T11:28:11.310 に答える
0

s.intern()インターンされた文字列への参照を返しますが、それを使用していません。試すs = s.intern()

于 2013-03-21T21:54:23.727 に答える