1. 程式人生 > >string字符串常量池在內存中的位置

string字符串常量池在內存中的位置

信息 clas sta ring eth 驗證 permgen java代碼 src

這裏僅僅是舉個簡單的樣例說明字符串常量池在內存中的位置。

閑言少敘,直接上代碼。

Java代碼 技術分享
  1. <span style="font-size: large;">import java.util.ArrayList;
  2. public class Test {
  3. public static void main(String[] args) {
  4. String str = "abc";
  5. char[] array = {‘a‘, ‘b‘, ‘c‘};
  6. String str2 = new String(array);
  7. //使用intern()將str2字符串內容放入常量池
  8. str2 = str2.intern();
  9. //這個比較用來說明字符串字面常量和我們使用intern處理後的字符串是在同一個地方
  10. System.out.println(str == str2);
  11. //那好,以下我們就拼命的intern吧
  12. ArrayList<String> list = new ArrayList<String>();
  13. for (int i = 0; i < 10000000; i++) {
  14. String temp = String.valueOf(i).intern();
  15. list.add(temp);
  16. }
  17. }
  18. }</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執行的內存比較好,稍小點就能驗證。

string字符串常量池在內存中的位置