2010-02-04 87 views
5

我對字符串有一些疑問垃圾收集和字符串

他們生活在堆或字符串池中嗎?

如果在堆上,那麼它們將被垃圾收集,如果它們不能被任何活動線程訪問。

如果在字符串池,然後他們將如何刪除或刪除,因爲我們知道垃圾收集只發生在堆上。

回答

8
String s = new String("abc"); 

由s稱爲字符串對象將在堆和字符串「ABC」將在字符串池。字符串池中的對象不會被垃圾收集。他們在該計劃的整個生命週期中都可以重複使用,以提高性能。

+0

如果你指的是_constant pool_它是類定義的一部分,那麼你_can_卸載常量池,只要你可以卸載類(通常需要非關聯的類加載器和所有引用它的加載類)。比你的典型程序更難,但Tomcat做到了。 – 2012-05-15 15:02:38

4

它們存儲在堆所有,但intern()編輯字符串(包括源字符串文字)是String類池引用

如果它們在源代碼中顯示爲文字(包括常量字符串表達式(例如"a" + "b")),那麼它們也將從出現在Class中的引用中出現,這通常意味着只要進程運行它們就會持續。

編輯: 當你調用intern()在代碼中的字符串時,它也被添加到該池,但因爲它使用弱引用可以仍然被垃圾收集如果不再使用的字符串。

參見:那篇文章 interned Strings : Java Glossary

報價:

在此HashMap註冊字符串有時也被稱爲串池的回收。然而,它們是普通的對象,就像任何其他對象一樣生活在堆上(可能是因爲interned字符串往往是長期存在的優化方式)。

0

字符串亞歷克斯進入文字池,只要進程運行(或Web應用程序保持加載。)通過finnw如告訴,並且永遠不會被垃圾收集在那裏停留。字符串name2不爲「Alex」分配內存,並從文字池中重新使用它。

PS:文字池也在堆上。

對於字符串約翰兩個對象創建參考name3和name4是垃圾回收。

String name = "Alex"; 
String name2 = "Alex"; 

String name3 = new String("John"); 
String name4 = new String("John");