2015-09-11 2 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, т.е. кандидата на сбор, когда они больше недоступны.

Значения String, полученные от String, литералы в бассейне не будут собираться, поскольку они всегда достижимы (YMMV с загрузчиками классов). String объекты, которые интернированы, но не исходят из литералов, должны стать кандидатами на GC в регулярной манере. не

Больше вещей следующим образом:

+0

Я знаю Мой пример кода был плохим. любые ссылки, которые вы предоставили, полезны. Благодарю. –

Смежные вопросы