Можем ли мы избежать интернирования строк в Java? - PullRequest
2 голосов
/ 15 апреля 2011

Можем ли мы полностью отключить интернирование строк?Это может быть не очень полезно, но просто мысль.Я могу подумать, по крайней мере, одна точка, где это может быть полезно, например, во время настройки jvm, контроля размера perm gen.

Например, если я выдаю OSGI-фреймворк, и любой может добавить любое количество собственных пакетов, и каждая интернирование строк в пакетах может полностью испортить мои параметры настройки.(Конечно, я знаю, что мы должны сделать настройку на данном фиксированном дистрибутиве, но все же ...)

Любые мысли !!

Ответы [ 4 ]

6 голосов
/ 15 апреля 2011

Размер / использование Permgen не проблема для современных JVM.Срочные строки становятся доступными для сборщика мусора, когда на них нет оставшихся ссылок.

(И нет, вы не можете "отключить" интернирование строковых литералов).

1 голос
/ 13 декабря 2013

Начиная с Oracle 7 Java, пул внутренних строк больше не сохраняется в PerGen.Подробнее читайте здесь http://java -performance.info / string-intern-in-java-6-7-8 /

1 голос
/ 15 апреля 2011

Вы можете отключить интернирование большинства строк, не используя строковые литералы в своем коде. Вместо этого вы можете использовать char [] и создавать Strings из них. Э.Г.

String hi = new String(new char[] { 'h', 'i' }); // not interned.

Как вы упомянули, это просто создает работу для вас и только ухудшит положение.

если я выдаю OSGI-фреймворк, и любой может добавить любое количество собственных комплектов, а интернирование строк каждого комплекта может полностью испортить мои параметры настройки

Если они добавляют пакеты, им может потребоваться более высокая, максимальная память, постоянный размер, прямой объем памяти, другое соотношение NewSize, даже другой GC. Единственный способ предотвратить это - запретить любые другие модули в вашем контейнере OSGi.

Или вы можете просто сказать, что если вы добавляете пакеты, вам может потребоваться изменить параметры настройки.

0 голосов
/ 15 апреля 2011

String является окончательным классом и не может быть расширен. Поэтому нет - вы не можете удалить возможность интернирования строк в Java.

...