2015-09-11 32 views
4

我很好奇如何從字符串池中刪除值?如何從字符串池中刪除未重複的值?

假設:

String a = "ABC"; // has a reference of string-pool 
String b = new String("ABC"); // has a heap reference 

b = null; 
a = null; 

在GC的情況下,從一堆「ABC」被收集,但「ABC」仍然在游泳池(因爲它在PermGen的和GC不會受到影響)。

如果我們繼續增加值,如:

String c = "ABC"; // pointing to 'ABC' in the pool. 

for(int i=0; i< 10000; i++) { 
    c = ""+i; 
    // each iteration adds a new value in the pool. Previous values don't have a pointer. 
} 

我想知道的是:

  • 將池中刪除未提及值?否則,這意味着游泳池正在吃掉不必要的記憶。
  • 那麼因爲JVM正在使用該池,那麼又有什麼意義呢?
  • 什麼時候這可能是性能風險?
+1

只有' 「ABC」'和' 「」'(第二個例子)是永久性的,我懷疑,但我沒有專家。 –

+0

'c'不在池中,字符串是不可變的。每次連接時都會創建一個新字符串,而這些字符串不在池中。 –

+0

所有字符串文字進入池中。 C將在游泳池中。如果我們用新的關鍵字創建對象,則爲 。它進入堆 –

回答

2

因爲這些代碼

String c = "ABC"; // pointing to 'ABC' in pool. 

for(int i=0; i< 10000; i++) { 
    c = ""+i; // each iteration add new value in pool. and pervious values has no pointer 

} 

只有兩個String對象將在游泳池中,來自兩個String文字,"ABC"""兩部分。從串聯創建的每個其他String將是具有常規GC行爲的常規對象,即。當他們不再可及時收集候選人。

StringString值來自String文字池中的文字不會被收集,因爲它們總是可以訪問(帶有類加載器的YMMV)。 String被實習但未來自文字的對象應定期成爲GC的候選人。

更多的東西閱讀:

+0

我知道我的示例代碼很差。任何你提供的鏈接都是有用的。謝謝。 –

相關問題