У меня есть следующие Java-класс:Java постоянное удаление пула во время выполнения
public class Test {
public static void main(String[] args) {
if (false) {
log("String_to_be_never_printed_1");
}
if (isPrintable()) {
log("String_to_be_never_printed_2");
}
}
private static boolean isPrintable() {
return false;
}
private static void log(String s) {
System.out.println(s);
}
}
В обоих случаях, если заявления, то результат будет ложным. Когда я вывожу постоянный бильярдный стол для этого класса, я получаю:
Constant pool:
#1 = Class #2 // Test
#2 = Utf8 Test
....
#18 = Utf8 isPrintable
#19 = Utf8 ()Z
#20 = String #21 // String_to_be_never_printed_2
#21 = Utf8 String_to_be_never_printed_2
#22 = Methodref #1.#23 // Test.log:(Ljava/lang/String;)V
#23 = NameAndType #24:#25 // log:(Ljava/lang/String;)V
...
String_to_be_never_printed_2 присутствует (# 20), когда String_to_be_never_printed_1 нигде не было видно. Ожидается, что компилятор оптимизирует первый оператор if.
Вопрос в том, удастся ли VM удалять String_to_be_never_printed_2 из постоянного пула (поскольку это никогда не будет использоваться)?
Ответ на этот вопрос может помочь вам, почему он не будет удален http://stackoverflow.com/questions/23121345/jvm-the-constant-pool-the-heap-and-the-addresses – kosa