Ich entwickle eine Desktop-Java-Anwendung und versuche, die Speichernutzung zur Laufzeit mit Java Visual VM zu optimieren.Java-Heap-Wachstum
Die Sache ist, dass ich bemerkt habe, dass mein benutzter Haufen um 1mb/s wächst und ich versuche herauszufinden, was das verursacht. Dies ist, wie es aussieht:
Zunächst einmal habe ich bemerkt, dass die JVM scheint zur Laufzeit von selbst ziemlich viel Speicher zu zuweisen. Ich habe versucht, ein Dummy-Programm zu machen, das gerade schläft und die Zunahme des benutzten Heaps schien ungefähr 0.2Mb/s zu sein.
Allerdings weist meine Anwendung offensichtlich mehr zu. Und ich weiß, dass ich zur Laufzeit ziemlich viele Objekte erzeuge, aber es sollte nicht in der Nähe von MBs/s sein, eher wie Bytes/Sekunde.
Also habe ich ein paar Dumps gemacht und sie verglichen. Hier ist der erste, wenn ein frischer GC aufgerufen wurde:
Und hier ist die andere, wo der verwendete Haufen gewachsen ist ~ 100 MB:
Hier ist der Vergleich:
Nun, was mich verwirrt ist, dass ich nicht finden kann y Spur der zusätzlichen 100 mb in den beiden Deponien.
Gesamt-Bytes sind gleich. Klassen sind gleich. Instanzen sind ungefähr gleich. Und der Vergleich gibt mir keine Hinweise. Die Dumps bestätigen jedoch, dass ich nur eine Handvoll Klassen/s verteile. Also was gibt es?
Update 1: Die Eclipse-Speicher-Manager:
(Die Verdächtigen sind nicht Täter). Und ich möchte betonen, dass visualVM mir zum Zeitpunkt der Dumps einen Unterschied von 100MB im verwendeten Heap zeigte. Meine In-Anwendung
print("Used Mbs: " + (r.totalMemory() - r.freeMemory())/mb);
Auch dies bestätigt. ('r' ist eine Runtime-Instanz)
könnten Sie uns Code zeigen? – niceman
Können Sie nach "nicht referenzierten" Objekten im Heap-Dump suchen? Die Objekte können zwar zugeordnet, aber nicht referenziert und für GC reserviert sein. – Konrad
Konrad, ich kann anscheinend nicht herausfinden, wie man das mit Java visualVM macht. Wissen Sie? – Jake