2016-03-29 16 views
3

Ich möchte die Speicherauslastung von zwei HashMaps in Java berechnen, und ich habe diese beiden Methoden.Berechnen Sie die Speicherauslastung einer HashMap in Java

1) Ich benutze die visualVM und ich habe folgendes Ergebnis.

Ist es nur die Größe des Hasmap-Pointers nicht die tatsächliche Größe der Speicherauslastung mit dieser Hashmap?

Weil es nur 67283648 Bytes verwendet. enter image description here

2) Ich führe den folgenden Code, die zwei HashMaps füllen und ich habe '' 576132056 '' Bytes als Ergebnis.

Runtime runtime = Runtime.getRuntime(); 
    long memory = runtime.totalMemory()- runtime.freeMemory(); 
    HashMap<String, TypePosting> typeInvIndex=qpu.loadInvTypeIndex(); 
    HashMap<Integer,String> map=qpu.loadMapTypeEntityId(); 
    long memory1 = runtime.totalMemory()- runtime.freeMemory(); 
    System.out.println(memory1- memory); 

Ich fragte nur diese Frage sicher sein, dass ich das zweite Ergebnis richtig der korrekte Wert der Raumnutzung dieser beiden HashMaps ist. Hab ich recht?

+3

Ich würde unter keinen Umständen # 2 als Messtechnik vertrauen. –

+1

Und so weit wie # 1 geht, ist das die Anzahl der Bytes, die direkt von den Knotenobjekten in den Hash-Maps genommen werden, was nicht den vollen Speicherverbrauch von 'HashMap' im Allgemeinen berücksichtigt. –

+0

Louis, ich bin nur neugierig, welche Methoden zum Abrufen von Runtime-Instanzen verwenden Sie in Google verwenden? Oder wie SIE dieses Problem lösen? Danke im Voraus – Cootri

Antwort

2

IMHO die beste (präzise und einfach zu implementieren) Möglichkeit, Java-Objekt-Instanz Speicherabdruck zur Laufzeit zu finden, ist Instrumentation Schnittstelle zu verwenden und einfache Java-Agent zu implementieren.

Es ist eine gängige Praxis, es gibt viele Anleitungen und Codebeispiele im Web. Just one example (die Sie als Ausgangspunkt verwenden können)