2016-04-27 4 views
2

У меня есть следующие 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 из постоянного пула (поскольку это никогда не будет использоваться)?

+0

Ответ на этот вопрос может помочь вам, почему он не будет удален http://stackoverflow.com/questions/23121345/jvm-the-constant-pool-the-heap-and-the-addresses – kosa

ответ

3

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

+1

'javac' имеет встроенные константы, известные во время компиляции. Если компилятор знает, что код не может быть запущен, его можно удалить +1 –

+0

Вы имеете в виду, что нет никакой цели, потому что фактический размер пула строк ничто по сравнению с размером кучи? –

+0

@ benjamin.d Нет, я имею в виду, что постоянный пул настроен в памяти с фиксированным размером и за пределами кучи до начала выполнения. Коллекция мусора работает только на том, что находится в куче, и нет смысла запускать ее на постоянном пуле, поскольку в эту память больше ничего не может – ControlAltDel

0

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

Смежные вопросы