Удаление постоянного пула 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);
    }

}

В обоих операторах if результат будет ложным. Когда я вывожу постоянную таблицу пула для этого класса, я получаю:

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.

Мой вопрос заключается в том, сможет ли виртуальная машина удалить String_to_be_never_printed_2 из пула констант (поскольку он никогда не будет использоваться)?


person benjamin.d    schedule 27.04.2016    source источник
comment
Ответ на этот вопрос может помочь вам, почему он не будет удален stackoverflow.com/questions/23121345/   -  person kosa    schedule 27.04.2016


Ответы (2)


Ничего никогда не удаляется из пула констант. В любом случае в этом не было бы смысла, так как удаление не повлияет на фактический размер памяти.

person ControlAltDel    schedule 27.04.2016
comment
javac содержит встроенные константы, известные во время компиляции. Если компилятор знает, что код не может быть запущен, его можно удалить +1 - person Peter Lawrey; 27.04.2016
comment
Вы имеете в виду, что нет никакой цели, потому что фактический размер пула строк ничто по сравнению с размером кучи? - person benjamin.d; 27.04.2016
comment
@benjamin.d Нет, я имею в виду, что постоянный пул устанавливается в памяти с фиксированным размером и вне кучи до начала выполнения. Сборка мусора работает только с тем, что находится в куче, и нет смысла запускать его в постоянном пуле, так как ничто другое не может попасть в эту память. - person ControlAltDel; 27.04.2016

Объекты, присутствующие в памяти кучи, могут быть удалены сборщиком мусора самой JVM. Объекты в пуле констант не удаляются сборщиком мусора, потому что они не оказывают большого влияния на размер памяти, назначенный JVM.

person KayV    schedule 27.04.2016