Строковые литералы не хранятся в стеке.
Строковые литералы (или, точнее, объекты String, которые их представляют) являются , исторически хранились в куче, называемой "permgen"куча.(Permgen - это сокращение от постоянного поколения.)
При нормальных обстоятельствах строковые литералы и большая часть других вещей в куче permgen доступны "постоянно" и не собирают мусор.(Например, литералы String всегда доступны из объектов кода, которые их используют.) Однако вы можете настроить JVM для поиска и сбора динамически загружаемых классов, которые больше не нужны, и это может привести к тому, что литералы String будут собираться мусором..
РАЗЪЯСНЕНИЕ № 1 - Я не говорю, что Пермген не получает GC '.Обычно это происходит, когда JVM решает запустить Full GC.Я хочу сказать, что строковые литералы будут доступны, пока код, который их использует, доступен, и код будет доступен, пока доступен загрузчик классов кода, а для загрузчиков классов по умолчанию это означает "навсегда ".
РАЗЪЯСНЕНИЕ # 2 - Фактически, Java 7 хранит внутренние объекты String в обычной куче.Это включает (я предполагаю) объект String, который представляет строковые литералы.(Подробности см. В ответе @ assylias.)