閑言少敘,直接上代碼。
- <span style="font-size: large;">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);
- }
- }
- }</span>
運行一下,會怎么樣?
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規范中所謂的方法區。
這里偷懶了一下,僅僅是指定了非常大的數10000000讓PermGen 溢出。只是時間可能長點。勤快的人還是自己指定java執行的內存比較好,稍小點就能驗證。