JVM ще изчерпи ли пространството на PermGen, ако създам произволен брой String обекти?

Да предположим, че пиша програма, която създава много String обекти и intern() тях:

String someString = param1 + param2;
someString.intern();

Това е добре за малък набор от низове, но какво ще стане, ако се опитам да създам милиард Strings? (или милиард * милиард по този въпрос?) Доколкото знам, JVM поддържа постоянен пул в областта PermGen за Strings и PermGen не получава GC-ed.

Така че, ако създам прекомерен брой String обекти в цикъл, но премахна референциите към тях, ще получат ли те GC-ed (ще ми свърши ли PermGen пространството)? Всички Strings са уникални без никакви дублирания.


person Adam Arold    schedule 03.10.2013    source източник


Отговори (2)


В Java 6 можете да попълните PermGen и той ще бъде изчистен.

В Java 7 интернираните низове не са в PermGen, а в купчината.

В Java 8 няма PermGen.

Литералните пулове съдържат само константи и ако създадете нов низ, той не е литерал, така че не е в пула на първо място.

Забележка: Хеш картата на String литерала не се преоразмерява. Обикновено е около 10K елемента по подразбиране. Докато добавяте записи, той става все по-бавен и по-бавен, докато се превръща в масив от свързани списъци.

person Peter Lawrey    schedule 03.10.2013
comment
Къде се съхраняват в Java 7? - person Marcelo; 03.10.2013
comment
По дяволите, толкова съм извън цикъла за разширените подробности за по-късните версии на Java. - person Kayaman; 03.10.2013

Не. Това, което показвате, не е буквалният синтаксис.

String myString = "a literal String";

Ще бъде буквалният синтаксис. Въпреки това можете да се уверите, че всичките ви низове са поставени в постоянния пул с метода String.intern(). Можете да тествате сами какво се случва, когато стажирате излишно количество низове.

person Kayaman    schedule 03.10.2013