2017-06-08 2 views
2

Ich habe Zweifel in Speicherzuweisung für int und Integer-Variable in Java. Um Speicher zu messen, habe ich Instrumentation.getObjectSize() verwendet und es erzeugt die gleiche Größe für beide Variablen. Bitte finden meinen Code unten:Speichergröße von Int vs Ganzzahl in Java

ObjectSizeFetcher.java

import java.lang.instrument.Instrumentation; 

public class ObjectSizeFetcher { 
    private static Instrumentation instrumentation; 

    public static void premain(String args, Instrumentation inst) { 
     instrumentation = inst; 
    } 

    public static long getObjectSize(Object o) { 
     return instrumentation.getObjectSize(o); 
    } 
} 

Test.java

public class Test { 
public static void main(String[] args) throws Exception { 
     int i=0; 
     Integer i1 = new Integer(0); 
     long value = ObjectSizeFetcher.getObjectSize(i); 
     System.out.println(value);//prints 16 

     long value1 = ObjectSizeFetcher.getObjectSize(i1); 
     System.out.println(value1);//prints 16 
} 
} 

Im obigen Fall sowohl die variable Größe druckt das gleiche. Mein Zweifel ist, Int ist primitiver Typ und es Größe 4 Bytes und Integer ist Referenztyp und seine Größe ist 16 Bytes, aber in diesem Fall warum 16 Bytes für beide Werte produziert? Wenn beide die gleiche Menge an Speicher in Heap nehmen, führt dies zu Speicherproblemen in Java, oder?

Antwort

2

i wird automatisch an einen Integer gesendet, wenn dieser an getObjectSize übergeben wird.

So erhalten Sie den Wert der Größe von Variable gefördert, nicht die ursprünglichen primitiven int.

dieses Verhalten zu umgehen, bauen Überlastungen von getObjectSize für die primitiven Fälle:

public static long getObjectSize(int o) { 
    return Integer.SIZE/8; 
} 

und so weiter.

2

int ist eine primitive Art und Größe 4 Bytes und Integer Referenztyp ist und seine Größe ist 16 Bytes. In diesem Fall warum 16 Bytes für beide Werte retuyrn?

Da der ObjectSizeFetcher.getObjectSize(Object) Aufruf der int zu einem Integer ist Autoboxing.

AFAIK gibt es keine Standard-API zu Maßnahme die Größe eines primitiven Typs oder eine Referenz. Ein Grund ist, dass die Größe davon abhängt, wo/wie es gespeichert ist. Zum Beispiel nimmt ein Byte, das in einem (großen) byte[] gespeichert ist, höchstwahrscheinlich weniger Platz in Anspruch als ein Byte, das als ein Feld eines Objekts gespeichert ist. Und eine byte gehalten wird eine lokale Variable könnte wieder anders sein. (Es gibt Probleme der Verpackung und der Ausrichtung zu tack Konto von.)

Es ist einfach, überladene Methoden zu schreiben, um konstant Minimum Größe für jede primitive Typen zurückzugeben. Verweise sind ein wenig komplizierter, da die Größe einer Referenz davon abhängt, ob Sie eine 32- oder 64-Bit-JVM verwenden und ob komprimierte Ups aktiviert sind.

+0

Wierd. Ich hätte inzwischen eine Menge Upvotes erwartet. Hier ist einer von mir. – Bathsheba

+0

Gibt es eine Möglichkeit, die Größe der Variablen/des Objekts in Java zu erhalten? –

+0

Sie können eine Last von Überladungen für getObjectSize erstellen und die Werte fest codieren. – Bathsheba