2016-05-13 10 views
-1

Ich dump alle Speicher (jmap-histo) nach dem Laden von Daten aus memcahced und dann lade ich die gleichen Daten erneut (Die Daten werden in eine andere Instanz geladen), aber die verwendet Speicher wurde nicht geändert. Kein GC wurde gemacht (ich zuteile 2g neue Größe Heap und überprüfen Sie mit Jstat und anderen Tools, dass kein GC getan wurde). Der zweite Heap enthält 2 Instanzen von dem Typ, den ich von memcached geladen habe. Ich vergleiche den Heap nach dem zweiten Laden mit dem Heap nach dem ersten Laden. Der zweite Heap hat in jeder Klassenart mehr Instanzen als der erste Heap außer [I, dass der zweite Heap kleiner als der erste ist. Das gleiche der Lücke (Bytes) zwischen den anderen Klassen im Heap ist das gleiche wie die Lücke für [I.Gebrauchte Speicherdosnt geändert, nachdem zusätzliches Objekt von memcached erhalten

Ich schaue auf den Byte-Code und habe nichts Verdächtiges gesehen. Irgendeine Idee?

public static void main(String[] args) throws Throwable { 
       Object a1 = mc.get("userClient"); 
       -- get dump 

      Object a11 = mc.get("userClient"); 
      -- get dump 
      mc.shutdown(); 
} 
+0

['freeMemory()'] (https://docs.oracle.com/javase/7/docs/api/java/lang/Runtime.html#freeMemory%28%29) liefert "eine Annäherung an die Gesamtsumme momentan verfügbarer Speicherplatz ". – JimmyB

+0

Dies ist der Grund, dass ich schrieb, dass ich jmap (jmap-histo) verwendet habe, um einen Dump zu machen und die Zahlen zu überprüfen. –

Antwort

0

Wenn Sie die Größe eines Objekts auf dem Heap sehen wollen, dann schalten Sie TLAB des (-XX: -UseTLAB) und überwachen die Änderung in Runtime.freeMemory() (Dump ist besser, weil Freememory Näherung) beim Erstellen eines Objekts. Diese Technik funktioniert nur für Objekte, die dem Heap hinzugefügt wurden, sodass lokale Variablen, die dem Stack hinzugefügt werden, nicht angezeigt werden.

Verwandte Themen