2016-04-27 7 views
2

Ich habe die folgende Java-Klasse:Java constant pool Entfernung zur Laufzeit

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); 
    } 

} 

In beiden if-Anweisungen wird das Ergebnis falsch sein. Wenn ich Ausgang für diese Klasse die Konstanten-Pool-Tabelle, die ich erhalten:

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 
    ... 

Die String_to_be_never_printed_2 vorhanden ist (# 20), wenn String_to_be_never_printed_1 nirgends zu sehen. Dies wird erwartet, da der Compiler die erste if-Anweisung optimiert hat.

Meine Frage ist, ob die VM es schafft, String_to_be_never_printed_2 aus dem Konstanten Pool zu entfernen (wie dies nie verwendet wird)?

+0

Antwort auf diese Frage könnte Ihnen helfen, warum es nicht entfernt wird http://stackoverflow.com/questions/23121345/jvm-the-constant-pool-the-heap-and-the-addresses – kosa

Antwort

3

Nichts wird jemals aus dem Konstanten-Pool entfernt. Es würde keinen Sinn in dieser ohnehin, da die Entfernung keine Auswirkung auf die tatsächliche Speichergröße

+1

Die 'javac' macht Inline-Konstanten zur Kompilierzeit bekannt. Wenn die Kompilierung kennt, kann der Code nicht ausgeführt wird, kann es 1 entfernt wird –

+0

Sie bedeuten, dass es keinen Sinn, da die tatsächliche Größe des String-Pools ist mit der Heap-Größe nichts im Vergleich? –

+0

@ benjamin.d Nein, was ich meine ist, dass der konstante Pool im Speicher mit einer festen Größe und außerhalb des Heaps vor Beginn der Ausführung eingerichtet wird. Garbage Collection läuft nur auf der im Heap ist, und es macht keinen Sinn, sie auf dem konstanten Pool zu laufen, da sonst nichts jemals in diesen Speicher gehen könnte – ControlAltDel

0

Objekte in Heap-Speicher vorhanden sind, haben würde, die sich durch JVM Garbage Collection in Betracht kommen. Die Objekte im Konstantenpool werden nicht als Garbage-Collection-Objekte behandelt, da sie keinen großen Einfluss auf die der JVM zugewiesene Speichergröße haben.