Многие люди говорят о преимуществах производительности String.intern(), но на самом деле меня больше интересует, какова может быть оценка исполнения.
Мои основные проблемы:
- Стоимость поиска: время, которое занимает intern(), чтобы выяснить, существует ли строка констант в пуле констант. Как эта шкала затрат с количеством строк в этом пуле?
- Синхронизация: очевидно, что пул констант совместно используется всей JVM. Как этот пул ведет себя, когда intern() вызывается снова и снова из нескольких потоков? Сколько блокировок оно выполняет? Как масштабируется производительность с конкуренцией?
Меня беспокоят все эти вещи, потому что я сейчас работаю над финансовым приложением, у которого есть проблема использования слишком большого количества памяти из-за дублированных строк. Некоторые строки в основном выглядят как перечисленные значения и могут иметь ограниченное количество потенциальных значений (например, названия валют ( "доллары США", "евро" )) существуют более чем в миллионах экземпляров. String.intern() в этом случае кажется неинтересным, но я беспокоюсь о накладных расходах на синхронизацию вызова intern() каждый раз, когда я где-то храню валюту.
Кроме того, некоторые другие типы строк могут иметь миллионы разных значений, но по-прежнему имеют десятки тысяч копий каждого (например, коды ISIN). Для этого я обеспокоен тем, что интернирование миллионной строки в основном замедлит метод intern(), чтобы уклониться от моего приложения.