Runtime.
Спецификации JLS и JVM определяют компиляцию javac для файлов классов, которые содержат объявления констант (в пуле констант) и постоянное использование в коде (который javac может встроить как ссылочные значения примитива / объекта).Для констант String во время компиляции компилятор генерирует код для конструирования экземпляров String и вызова для них String.intern (), чтобы JVM автоматически интернировала String константы.Это поведенческое требование от JLS:
http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.28
Постоянные выражения времени компиляции типа String всегда "интернированы", так чтодля совместного использования уникальных экземпляров, используя метод String.intern.
Но в этих спецификациях нет ни концепции, ни определения каких-либо структур / ссылок / дескрипторов / ссылок / внутренних переменных String, будь то время компиляции или время выполнения,(Конечно, в общем, спецификация JVM не требует какой-либо конкретной внутренней структуры для объектов: http://docs.oracle.com/javase/specs/jvms/se7/html/jvms-2.html#jvms-2.7)
Причина, по которой структуры внутреннего пула не упоминаются, заключается в том, что они полностью обрабатываются с помощью класса String.Внутренний пул является частной статической структурой на уровне класса класса String (не определяется спецификациями JLS & JVM и javadoc).
Объекты добавляются в внутренний пул при вызове String.intern () во время выполнения.Внутренний пул эффективно используется классом String - когда код создает новые экземпляры String и вызывает String.intern (), класс String определяет, следует ли повторно использовать существующие внутренние данные. Оптимизация может выполняться компилятором JIT - во время выполнения.
Здесь нет никакого вклада во время компиляции, за исключением ванильного встраивания постоянных значений.