То, когда постоянные строки, создало/уничтожило?

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

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. Когда Строки собраны "мусор"? Они собраны "мусор" вообще? Принятие того же метода можно называть много раз во время жизни программ разве, это не имеет смысла к, просто кэшируют их?

5
задан Joachim Sauer 2 June 2010 в 10:21
поделиться

1 ответ

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

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

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

6
ответ дан 14 December 2019 в 13:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: