2015-12-18 14 views
5

Werden Objekte nur erstellt, wenn das Schlüsselwort new verwendet wird? Wie viele Objekte wurden erstellt, nachdem dieser Code die Kommentare erreicht hat? Ich sage 4 neue Objekte, weil der Konstruktor bei jeder Initialisierung einer Carnew Exception() aufruft. Wie überprüfe ich die Anzahl der erstellten Objekte?Anzahl der in Java erstellten Objekte ermitteln

+2

Ist das Hausaufgabe? Ich habe das auf Prüfungen gesehen, bevor ... –

+3

'new' ist nicht die einzige Möglichkeit, Objekte zu erstellen und ist daher kein zuverlässiger Zähler: http://stackoverflow.com/questions/95419/what-are-all -the-different-ways-zu-erstellen-ein-objekt-in-java In deinem Fall funktioniert es aber, ja 4 Objekte sind hier erstellt. – MC10

+0

Die Ausnahme wird wahrscheinlich eine Stack-Trace intern erstellen, die eine beliebige Anzahl von Stack-Trace-Elementen erstellen kann ... –

Antwort

8

Es gibt keine (zumindest nicht meines Wissens) automatisierte Art zu zählen, wie viele Objekte in Java erstellt wurden. In Ihrem Beispiel werden jedoch 4 Objekte erstellt, 2 Ausnahmen und zwei Autos.

Wenn Sie zählen möchten, wie viele Objekte für eine bestimmte Klasse vorhanden sind, können Sie einen statischen Zähler haben, der jedes Mal erhöht wird, wenn ein Objekt erstellt wird.

Edit: Sie können erstellte Objekte zählen jmap verwenden, wie von Andreas wies darauf hin, obwohl es sich um eine nicht sehr praktische Lösung ist

+0

Sie könnten die * Java virtuelle Maschine * ändern, um die Anzahl der malloc-Operationen usw. zu zählen. –

+2

@CommuSoft Sie könnten neu erstellen Das Universum, um einen Apfelkuchen zu backen ...: D –

+1

Das Upgrade der virtuellen Maschine heißt AspectJ oder so. –

3

Sie jmap verwenden können und jhat ein Speicherabbild der JVM zu erhalten.

Das Hinzufügen eines Thread.sleep(20000) am Kommentar wird das Programm 20 Sekunden warten lassen, damit Sie die folgenden Befehle ausführen können. Erhöhen Sie die Wartezeit, falls erforderlich.

In einer Eingabeaufforderung führen Sie Ihr Programm:

java -cp . Car 

In einer anderen Eingabeaufforderung während der die 20 Sekunden warten, laufen

jps 
jmap -dump:file=C:/temp/x.dmp 99999 
jhat C:/temp/x.dmp 

Wo 99999 ist die Prozess-ID in der aufgelisteten Ausgabe von jps.

Das jhat Programm startet einen Web-Server auf Port 7000, so gehen Sie zu:

http://localhost:7000/ 

Klicken Sie auf "Instanz für alle Klassen zählt (ohne Plattform)", und Sie werden 2 Objekte sehen nur:

2 instances of class Car 

Das ist, weil Sie die Exception Klasse aus dem Display ausgeschlossen haben.

Wenn Sie geklickt haben, auf die „... (einschließlich Plattform)“ -Link, dann würden Sie eine Menge von Objekten, mit so etwas wie dies sehen:

Total of 6214 instances occupying 8071681 bytes. 

Wenn Sie eine eigene Ausnahme implementieren, e.q. CarException und Wurf, der stattdessen Sie erstellt 4 "user" Objekte sehen:

2 instances of class Car 
2 instances of class CarException 

Also, die Antwort ist richtig? 2, 4 oder 6214?
Wahrscheinlich ist die erwartete Antwort 4, wie in "Wie viele Objekt hat Ihr Programm erstellen?".


Bezüglich Frage, ob Objekte nur erstellt werden, wenn das new Schlüsselwort verwendet wird, ist die Antwort Nein. Es gibt viele andere Möglichkeiten (zum Beispiel in dieser Antwort aufgeführt: https://stackoverflow.com/a/2103578/5221149), und hier sind ein paar, mit Kommentaren für die Anzahl der Objekte, die von dem Konstrukt erstellt:

// Using "new" 
new MyObject()  // 1 + number of objects created by constructor 
new int[0]   // 1 
new int[10]   // 1 
new int[] {1,2,3,4} // 1 
new int[10][]  // 1 
new int[10][20]  // 11 (1 outer array + 10 inner arrays) 

// Not using "new" 
int[] x = {1,2,3,4} // 1 
Integer x = 1  // 1 <-- autoboxing 
printf("", i, j) // 3 (autobox of i + autobox of j + varargs array) 
String x = "a" + i // 3 (StringBuilder + String + array backing String) 
Integer[][] x = {{1111},{2222},{3333,4444},{},{}} // 10 (1 outer array + 5 inner arrays + 4 Integers) 
Verwandte Themen