小例:String常量池の位置をどう説明しますか?


以前「Javaスタックとスタックについての考え」というスレッドを立てたことがありますが、具体的な内容はhttp://zangxt.iteye.com/blog/440330を参照してください.
    ここでは単純な例を挙げるだけで、文字列定数メモリの位置を説明します.
    余談はさておき、直接コードします.
 
import java.util.ArrayList;

public class Test {

    public static void main(String[] args) {
        String str = "abc";
        char[] array = {'a', 'b', 'c'};
        String str2 = new String(array);
        //  intern() str2          
        str2 = str2.intern();
        //                    intern              
        System.out.println(str == str2);
        //  ,        intern 
        ArrayList<String> list = new ArrayList<String>();
        for (int i = 0; i < 10000000; i++) {
            String temp = String.valueOf(i).intern();
            list.add(temp);
        }
    }
}
 
実行してみたらどうなりますか?
true Exception in thread「main」java.lang.OutOfMemoryError:PermGen space        at java.lang.String.intern(Native Method)        at Test.main(Test.java:16)Java Result:1  
 
     異常情報はPermGenがいっぱいだと教えてくれます.えっと、文字列の定数がどこにあるか分かります.PermGenはjvm仕様の中でいわゆる方法エリアです.
     ここは怠けています.大きな数を指定しただけで、PermGenを溢れさせます.でも、時間は長いかもしれません.まめな人はやはり自分でjava運行のメモリを指定したほうがいいです.少し小さくして確認できます.