Реальная жизнь, практический пример использования String.intern () в Java?

Добавьте макрос ниже в визуальную студию.

http://visualstudiomacros.blogspot.com/2008/03/getting-ctrl-right-arrow-to-respect.html

24
задан Tom N 18 August 2010 в 08:59
поделиться

5 ответов

Интернирование может быть очень полезным, если у вас есть строки N , которые может принимать только K различных значений, где N намного превышает K . Теперь вместо хранения N строк в памяти вы будете хранить только до K .

Например, у вас может быть тип ID , который состоит из 5 цифр. Таким образом, может быть только 10 ^ 5 разных значений. Предположим, вы сейчас разбираете большой документ, в котором есть много ссылок / перекрестных ссылок на значения ID . Допустим, в этом документе всего 10 ^ 9 ссылок (очевидно, что некоторые ссылки повторяются в других частях документа).

Итак, N = 10 ^ 9 и K = 10 ^ 5 в этом случае. Если вы не интернируете строки, вы сохраните в памяти 10 ^ 9 строк, где многие из этих строк равны (по Принципу голубятни ). Если вы intern () строка ID получаете при синтаксическом анализе документа, и вы не сохраняете никаких ссылок на неинтернированные строки, которые вы читаете из документа (так что они можно собирать мусор), то вам никогда не понадобится хранить в памяти более 10 ^ 5 строк.

21
ответ дан 29 November 2019 в 00:15
поделиться

Примеры, когда интернирование будет полезным, включают строки с большим числом, где:

  • строки, вероятно, выдержат несколько циклов сборки мусора, и
  • вероятно будет несколько копий большого процента строк.

Типичные примеры включают разбиение / анализ текста на символы (слова, идентификаторы, URI) и последующее присоединение этих символов к долгоживущим структурам данных. Обработка XML, компиляция языков программирования и тройные хранилища RDF / OWL приходят на ум как приложения, в которых интернирование может оказаться полезным.

Но интернирование не обходится без проблем, особенно если выясняется, что вышеприведенные предположения неверны:

  • структура данных пула, используемая для хранения интернированных строк, занимает дополнительное место,
  • интернирование требует времени и
  • ​​интернирование в первую очередь не предотвращает создание повторяющейся строки.

Наконец, интернирование потенциально увеличивает накладные расходы сборщика мусора за счет увеличения количества объектов, которые необходимо отслеживать и копировать, и за счет увеличения количества слабых ссылок, которые необходимо обрабатывать. Это увеличение накладных расходов должно быть уравновешено уменьшением накладных расходов сборщика мусора в результате эффективного интернирования.

1
ответ дан 29 November 2019 в 00:15
поделиться

Не полный ответ, а дополнительная пища для размышлений ( здесь ):

Таким образом, основное преимущество в в данном случае использование оператора == для интернализованных строк намного быстрее, чем использование метода equals () [для неинтернализованных строк]. Итак, используйте метод intern () , если вы собираетесь сравнивать строки более одного или трех раз.

1
ответ дан 29 November 2019 в 00:15
поделиться

Никогда, никогда, не используйте intern на данных, предоставленных пользователем, так как это может вызвать атаки отказа в обслуживании (поскольку строки, обработанные intern()ed, никогда не освобождаются). Вы можете выполнить проверку на предоставленных пользователем строках, но тогда вы уже выполнили большую часть работы, необходимой для intern().

0
ответ дан 29 November 2019 в 00:15
поделиться

У нас была производственная система, которая обрабатывает буквально миллионы единиц данных одновременно, многие из которых имеют строковые поля. Мы должны были интернировать строки, но была ошибка, из-за которой мы этого не делали. Исправив ошибку, мы избежали необходимости делать очень дорогостоящее (по крайней мере, 6 цифр, возможно, 7) обновление сервера.

1
ответ дан 29 November 2019 в 00:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: