Warum ein Sägezahn-förmigen graph?
Wenn ich den unten genannten code mit NetBeans, die zugeteilte heap-Größe-Diagramm ähnelt einer Sägezahn-Form. Ich bin die Befestigung der screen-capture von JVisualVM, das zeigt die heap-allocation graph mit einem Sägezahn-Form. Das Programm ist eine einfache Endlosschleife Druck "Hallo, Welt!" in der Konsole.
public class HelloWorld {
public static void main(String a[]){
while(true) {
System.out.println("Hello, World!");
}
}
}
Kann jemand erklären, der Grund für die Form des Graphen der heap verwendet?
PS: Das passiert auch, wenn ich es ohne Verwendung von NetBeans, so ist es wahrscheinlich nicht mit NetBeans...
- Und scheint zu variieren, durch eine gute... äh... 3 Megabyte? Kann das wirklich wahr sein?
- Sie bekommen einen Einblick in dies, indem Sie versuchen andere garbage-collector-algorithmen. Siehe hier für Infos: tikalk.com/java/...
- unterschätzen Sie niemals die gigantische Menge von Müll, selbst die triviale Java-Methode/API generieren zu können. Ich habe getan, multi-threaded-wissenschaftliche Berechnung mithilfe von Java-und ich kann Ihnen sagen, es gibt so viele Fallstricke, es ist auch nicht lustig 😉 Sie haben zu erkennen, dass die meisten Java-Programmierer gerne benutzen, Dinge wie Map<Integer,Long> und Ihnen sagen, dass, wenn es nicht einen Engpass, es gibt nichts falsch mit ihm. Java ist im Grunde eine Welt, wo sich fast jeder erzeugt unzählige überflüssige und denken: "Der garbage collector darum kümmern". Es gibt einen Grund, warum Photoshop ist nicht in Java geschrieben 😉
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dem sägezahnmuster in die heap-Verwendung kann durch die Tatsache erklärt werden, dass mehrere lokale Variablen werden erstellt, während die Anrufung der
System.out.println
Aufruf. Vor allem in der Oracle/Sun-JRE, mehrereHeapCharBuffer
Instanzen erstellt werden, in der Jungen generation, wie erwähnt, in der folgende Schnappschuss, erhalten mit dem memory-profiler von VisualVM:Das interessante bit ist in der Anzahl der live-Objekte, die vorhanden sind, auf dem heap. Das Sägezahn-Muster resultiert aus der young-Generation-garbage-collection-Zyklus, der Auftritt, wenn die eden Raum füllt sich; da gibt es keine schwere computational durchgeführten Aktivitäten im Programm, die JVM ist in der Lage zum ausführen von mehreren Iterationen der Schleife, was in den eden space (von 4 MB ist in der Größe) füllen. Die nachfolgende, junge Generation-Kollektion Zyklus dann klärt sich das meiste von dem Müll; es ist fast immer das ganze des eden space, es sei denn, die Objekte sind immer noch in Gebrauch, wie dies durch die folgende gc-trace erhalten Sie von VisualVM:
Das Verhalten der Sägezahn-Muster können somit erklärt werden durch eine Reihe von Klassenzuordnungen, in rascher Folge, füllen sich die eden Raum, das auslösen einer Jungen Generation-garbage-collection-Zyklus; dieser Prozess wiederholt sich zyklisch mit keine Verzögerungen, da die zugrunde liegenden JVM-Prozess wird nicht verdrängt von einem anderen Prozess, und der Haupt-thread innerhalb der JVM, die ist verantwortlich für die Objekt-Allokationen ist auch nicht verdrängt von einem anderen thread.
Jeder Prozess zum zuordnen von Objekten in regelmäßigen rate wird eine stetige Zunahme der Speicher-heap-Verbrauch, gefolgt von sofortiger fällt, wenn der garbage collector) sammelt den nicht mehr verwendeten Objekten, was in diesem Sägezahn-Form.
Falls Sie sich Wundern, warum Ihre java-Prozess hält die Zuteilung von Speicher während des Schreibens auf
System.out
im Hinterkopf behalten, dass andere threads (zum Beispiel einer Fütterung der aktuelle Speicher-Statistiken zu JVisualVM) können diejenigen sein, die Zuweisung der Erinnerung.instantaneous drops
. Wenn Objekte zugewiesen werden, sind sehr groß, sagen wir ein Objekt ~ 10% der RAM-Größe ist, dann kann man sichreversed sawtooth
graph. I. E. Objekt-Zuweisung greifen, werden neue Speicher sofort, aber GC-Sammler wird der freie Speicher in stetigen Rückgang rate. Also eigentliche Grafik hängt von der durchschnittlichen Größe des Objekts im SpeicherGibt es viele Orte, es könnte kommen, und es ist wahrscheinlich, Umsetzung abhängig. Mindestens die folgenden sind möglich (aber sind alles nur Spekulationen)
irgendwo in den stapeln der streams unter System.aus.println es ist ein byte-array-Zuweisung (gegeben, dass eine der grundlegenden Methoden einer output-stream ist write(Byte []b, int off, int len))
it-overhead verwendet, die durch die monitoring-software, die Sie verwenden (ich habe nicht verwendet es)
it ' s overhead in der netbeans-VM, wo es endet zeigt die Ausgabe
Eigentlich jVisualVM die zusätzliche Objekt-Allokation. jVisualVM und jconsole werden mit Hilfe der Java Management Extensions. Befestigung an der Laufenden Anwendung und die Anforderung von JVM-Metriken verursacht, dass zusätzliche Objekte erstellt werden.
Sie können dies überprüfen, indem Sie in Ihrem Programm aufrufen, um
die Berichte der freie Speicher in der JVM-heap. Es wird sich zeigen, [fast] ohne Speicher ändern, indem Sie Ihren code ausführen, aber sobald Sie die Verbindung zwischen jVisualVM zu Ihrem Programm sehen Sie die Speicherauslastung zu erhöhen.