В качестве ссылок на комментарии см.: http://java-performance.info/string-intern-in-java-6-7-8/. Это очень проницательная ссылка, и я многому научился, однако я не уверен, что ее выводы обязательно «один размер подходит всем». Каждый аспект зависит от потребностей вашего собственного приложения - настоятельно рекомендуется проводить измерения реальных входных данных!
Основной фактор, вероятно, зависит от того, что вы находитесь в контроле над:
У вас есть полный контроль над выбором GC? Например, в приложении с графическим интерфейсом все еще существует серьезный аргумент в пользу использования Serial GC. (гораздо меньший объем памяти для процесса - думаю, 400 МБ против ~ 1 ГБ для умеренно сложного приложения и гораздо более желательная релиз-память, например, после кратковременного всплеска в использовании). Таким образом, вы можете выбрать это или дать своим пользователям возможность. (Если куча остается маленькой, паузы не должны быть большими).
У вас есть полный контроль над кодом?Опция G1GC отлично подходит для сторонних библиотек (и приложений!), Которые вы не можете редактировать.
Второе соображение (в соответствии с @ ответ Zhongyu в) является то, что String.intern
может отменить дублирование String
самих объектов, в то время как G1GC обязательно могут только де-дублировать свои частные char[]
поле.
Третье соображение может быть связано с использованием ЦП, скажем, если влияние на срок службы батареи ноутбука может вызвать озабоченность у ваших пользователей. G1GC запускает дополнительный поток, предназначенный для удаления дубликатов кучи. Например, я играл с этим, чтобы запустить Eclipse, и обнаружил, что он начал начальный период увеличения активности процессора после запуска (думаю, 1 - 2 минуты), но он поселился на небольшой куче «в использовании» и не стал очевидным (просто глаз- свертывание диспетчера задач) Накладные расходы процессора или замедление после этого. Таким образом, я предполагаю, что определенный процент от ядра процессора будет рассмотрен при дедупликации (в течение? После?) Периодов высокой памяти-оттока. (Конечно, могут быть сопоставимые накладные расходы, если вы вызываете String.intern всюду, который также будет работать в серийном, но затем ...)
Вам, вероятно, не требуется разворот строк во всем мире. Есть, вероятно, только некоторые области кода, которые:
- действительно влияют долгосрочное использование кучи, и
- создать высокую долю дублированных строк
С помощью String.intern
выборочно, другие части кода (который может создавать временные или полу-временные строки) не оплачивают цену.
И, наконец, быстрый разъем для утилиты Гуавы: Interner, что:
Обеспечивает эквивалентное поведение String.intern()
для других неизменных типов
Вы также можете использовать это для струнных. Возможно, память (и должна быть) связана с вашей максимальной производительностью, поэтому это, вероятно, часто не применяется: однако, когда вам нужно сжимать каждую капли скорости из какой-либо области с горячей точкой, мой опыт в том, что слабая ссылка на Java Решения HashMap работают немного, но последовательно быстрее, чем реализация JVM C++ String.intern()
, даже после настройки параметров jvm. (И бонус: вам не нужно настраивать параметры JVM для масштабирования на разные входные данные.)
[Предлагаемое видео] (https://www.youtube.com/watch?v=YgGAUGC9ksk) - но в любом случае, вывод всегда один и тот же: вы. Должен. Не. Забота. – fge
извините, не должен заботиться о чем? о том, какой из них использовать (что означает их эквивалент) или о новой функции (что означает, что это не так полезно)? – Hilikus
Смысл: просто используйте класс 'String' без второй мысли. – fge