Когда постоянные строки создаются / уничтожаются? - PullRequest
5 голосов
/ 02 июня 2010

Рассмотрим следующий код

public static void method(String[] srgs){  
try{  

}catch(){  
System.out.println("Hello World" + "one");}  
catch(..){  
System.out.println("Hello World" + "two");}
catch(..){  
System.out.println(getString());}
}
  1. Когда создаются эти строки? Я предполагаю, что строки будут созданы, когда возникнет исключение во время выполнения. Строка создается во время выполнения и отображается. Мой коллега говорит мне, что, поскольку это постоянные строки, они будут созданы, как только класс загрузится. Это правильно?

  2. Когда собирается мусор Strings? Они мусор вообще? Предполагая, что один и тот же метод может вызываться много раз за время жизни программ, не имеет смысла просто их кэшировать?

1 Ответ

6 голосов
/ 02 июня 2010
  1. Эти строки на самом деле являются константной строкой и будут находиться в постоянном пуле класса и, следовательно, будут создаваться в JVM при загрузке класса. Тот факт, что они создаются с помощью +, не имеет значения, поскольку вся строка является постоянным выражением (то есть оно будет точно таким же, как если бы вы написали "Hello Worldone" и "Hello Worldtwo"). Эти правила описаны в § 3.10.5 Строковые литералы JLS.

  2. String объекты отбираются так же, как и любой другой объект, сборка мусора, в них нет ничего особенного. Однако некоторые строки являются интернированными (прежде всего это включает все строковые литералы), что может или не может помешать их сборке мусора (это не определено и зависит от реализации).

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

...