So finden Sie die Anzahl der Objekte im Heap
Wie finde ich die Anzahl der live-Objekte auf dem heap in Java-Programm?
Kommentar zu dem Problem
Für, was Grund, Sie müssen wissen, die Zahl der live-heap-Objekte? Chancen sind, gibt es ein besserer Weg, das zu tun, was Sie wollen.
Möchten Sie diese information erhalten Sie von innerhalb des Programms selbst? Oder ein debugging-tool?
InformationsquelleAutor der Frage java_geek | 2010-02-14
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es ist ein hack, die Sie ausprobieren können:
sehen, dieses (alte) Artikel für eine Probe.
Wahrscheinlich gibt es bessere Möglichkeiten, es zu tun mit JPDA oder JMX, aber ich habe nicht gefunden, wie...
InformationsquelleAutor der Antwort Carlos Heuberger
jmap ist die standard-java-Dienstprogramm, das Sie verwenden können, um zu erfassen, heap-dumps und Statistiken. Ich kann nicht sagen, welches Protokoll verwendet wird, durch die jmap Verbindung zu der JVM um diese Informationen zu bekommen, und es ist nicht klar, ob diese information verfügbar ist, um ein Programm läuft in der JVM direkt (obwohl ich sicher bin, das Programm kann die Abfrage der JVM durch einige socket um diese Informationen zu erhalten).
JVM TI ist ein Werkzeug, Schnittstelle, verwendet von C-code, und es hat ziemlich vollen Zugriff auf das treiben auf der JVM, aber es ist C-code und nicht direkt von der JVM. Wahrscheinlich könnten Sie schreiben eine C-lib und dann-Schnittstelle mit, aber es gibt nichts, out of the box.
Gibt es mehrere JMX MBeans, aber ich glaube nicht, dass einer von Ihnen ein Tatsächliches Objekt zu zählen. Erhalten Sie Speicher-Statistiken von diesen aber (diese sind, was JConsole verwendet). Überprüfen Sie heraus die java.lang.management-Klassen.
Wenn Sie möchten, dass einige schnell (einfach zu implementieren, nicht unbedingt mit einem schnellen Ergebnis, wie eine jmap einige Zeit in Anspruch nimmt), würde ich die Gabel ab einer Auflage von jmap, und Lesen Sie einfach die resultierende Datei.
InformationsquelleAutor der Antwort Will Hartung
Der einfachste Weg ist
jmap
tool. Wenn Sie print-Objekte Histogramm am Ende werden Sie sehen, Gesamtzahl der Instanzen und auch akkumulierte Größe aller Objekte:jmap -histo <PID>
gedruckt werden ganze Objekte mit der Anzahl der Instanzen und die Größe. Die Letzte Zeile enthält insgesamt AnzahlTotal 2802946 174459656
Zweiten Spalte ist die Summe der Instanzen zu zählen, und das Letzte ist total bytes.
InformationsquelleAutor der Antwort Jakub Kubrynski
Verwenden jvisualvm, und führen Sie einen Speicher-Beispiel. Es wird sich zeigen, die Anzahl von Klassen und Instanzen:
InformationsquelleAutor der Antwort Bin Wang
Soweit ich weiß, kann man nicht. Sie können, Holen Sie jedoch die Menge des verwendeten Speichers für das Programm:
InformationsquelleAutor der Antwort Scharrels
Wenn alle Objekte werden erstellt unter Verwendung einer Art von
Factory
- Klasse finden Sie die Anzahl der Objekte im heap. Selbst dann haben Sie etwas in derfinalize()
Methode. Natürlich, dies kann nicht getan werden für alle Objekte, z.B. das jdk-Klassen-Bibliothek kann nicht geändert werden. Aber wenn Sie wollen, zu finden, die Anzahl der Instanzen einer bestimmten Klasse, die Sie erstellt haben, können Sie möglicherweise feststellen, dass.InformationsquelleAutor der Antwort fastcodejava
Für das Debuggen, können Sie einen profiler verwenden (wie YourKit, eine kommerzielle java-profiler). Sie finden sowohl open-source-und kommerziellen Varianten von java-Profiler.
Für die integration mit Ihrer code, Sie könnten mit "Aspect-Oriented Programming" - Technik. AOP-frameworks (z.B. AspectWerkz) ändern Sie die class-Dateien im class-load-Zeit. Dies können Sie ändern Konstruktoren zur Registrierung der Objekte zu Ihrem "alle-meine-runtime-Objekte-framework".
InformationsquelleAutor der Antwort Melv
InformationsquelleAutor der Antwort santhosh
InformationsquelleAutor der Antwort MALAY GHOSH
InformationsquelleAutor der Antwort Anji Pavuluri