Instanzen herunterzählen

Status
Nicht offen für weitere Antworten.

weijg

Mitglied
ich habe hier einen Konstruktor:

Code:
             public Medium(int mediennummer,Strin titel){

                     anzInstanzen++; //als static  variable definiert wurde
                     this.mediennummer = mediennummer;
                     this.titel = titel;

}
wenn ein Instanze erzeugt wurde, wurde anzInstanzen hochgezählt.

aber falls Objekte gelöscht werden sollten, in welcher Methode muss die Anzahl der Instanzen heruntergezählt werden.

Code Tags eingefügt /Stefan1200
 

virgie82

Mitglied
tja also wenn ich das richtig verstanden habe soll, willst du in der gleichen klasse eine static variable hochzählen wenn eine neue instanz dieser erstellt wird und in der gleichen klasse runterzählen wenn diese instanzen zerstört wird.......

na hola die waldfee, wenn du das hinbekommt, kriegste den nobelpreis....

man kann doch nich in der gleichen klasse ne variable laufen lassen die zählt wenn du ne instanz dieser klasse erzeugtst oder zerstörst ...mach doch das in der klasse in der du diese instanzen heraus erzeugst und zerstörst und nich in der gleichen klasse die erzeugt/zerstört wird...

oder hab ich da was falsch verstanden???dann sorry, aber genauere angaben, plz...!!!

grützl
 

KSG9|sebastian

Top Contributor
Code:
class KlasseDieGezaehltWird{
//Instanzvariablen
private static int anzInstanzen=0;

public KlasseiDieGezaehltWird(){
    anzInstanzen++;
}
public static void remInstanz(){
    anzInstanzen--;
}
}

Aufruf funktioniert so;

Code:
KlasseDieGezaehltWird k = new KlasseDieGezaehltWird();

k=0;
KlasseDieGezaehltWird.remInstanz();
 

Bleiglanz

Gesperrter Benutzer
manche Instanzen werden nie zerstört (wenn du genug speicher hast)

aber wenns denn sein muss: finalize
 

Sky

Top Contributor
Ansonsten kannste auch Referenzen auf deine Instanz in einem Set / einer Map hinterlegen. Bei Bedarf einfach die Map entsprechend pflegen. Die Anzahl der Referenzen im Container entspricht somit der Anzahl deiner Instanzen...
 

mic_checker

Top Contributor
Hierzu noch etwas aus em Handbuch der Java Programmierung:

Tatsächlich garantiert die Sprachspezifikation nicht, daß ein Destruktor überhaupt aufgerufen wird. Wenn er aber aufgerufen wird, so erfolgt dies nicht, wenn die Lebensdauer des Objektes endet, sondern dann, wenn der Garbage Collector den für das Objekt reservierten Speicherplatz zurückgibt. Dies kann unter Umständen nicht nur viel später der Fall sein (der Garbage Collector läuft ja als asynchroner Hintergrundprozeß), sondern auch gar nicht. Wird nämlich das Programm beendet, bevor der Garbage Collector das nächste Mal aufgerufen wird, werden auch keine Destruktoren aufgerufen. Selbst wenn Destruktoren aufgerufen werden, ist die Reihenfolge oder der Zeitpunkt ihres Aufrufs undefiniert. Der Einsatz von Destruktoren in Java sollte also mit der nötigen Vorsicht erfolgen.

Nur als Ergänzung zu dem was Bleiglanz gepostet hat.
 

Karl

Aktives Mitglied
Hallo,

es gibt da einen Weg, den Garbage-Collector zu belauschen, allerdings solltest Du das nur tun, wenn es nicht zu viele beobachtete Instanzen sind, weil damit ein gewisser Overhead einhergeht.

sky80 hat die Lösung ohne es zu ahnen schon skizziert:
Stecke Deine Referenzen als key in eine WeakHashMap. Das Objekt, dass du als value nimmst, ist in
diesem Fall völlig egal, es sollte immer dasselbe sein, um Ressourcen zu sparen.

Der Witz ist folgender:
An entry in a WeakHashMap will automatically be removed when its key is no longer in ordinary use. More precisely, the presence of a mapping for a given key will not prevent the key from being discarded by the garbage collector, that is, made finalizable, finalized, and then reclaimed. (API)

Wenn also ein Objekt weggeräumt wird, sinkt die Anzahl Mappings - die gesuchte Zahl der noch existierenden Instanzen.

Ich habe leider momentan keine Möglichkeit, Dir ein Codebeispiel zu geben, aber vielleicht fühlt sich ja
virgie82 angespornt, sich selbst den Nobelpreis zu holen, den sie oder er (?) ausgelobt hat :D) ?

Gruß,

Karl
 

Karl

Aktives Mitglied
Hallo,

für die, die es interessiert, hier die Beispielimplementierung, um dem Garbage-Collector bei der Arbeit zuzusehen:
Code:
package prob;

import java.util.WeakHashMap;

/**
 * Beispiel, um die Arbeit des Garbage Collectors (GC) zu beobachten.
 * 
 * @author Karl Eilebrecht, 2005-01-29
 */
public class GCDemo {

	/**
	 * Hier werden die Instancen als Schlüssel verwaltet.
	 */
	private static final WeakHashMap INSTANCES = new WeakHashMap();

	/**
	 * Die WeakHashMap dient nur zum Zählen, daher ein DUMMY-Wert, als key wird
	 * die jeweilige Instanz benutzt.
	 */
	private static final Integer DUMMY_VALUE = new Integer(0);

	/**
	 * Eine Instanz soll auch etwas mehr Speicher verbrauchen, sonst dauert es
	 * ewig, bis der GC anspringt.
	 */
	private static final int INSTANCE_MEMORY_CONSUMPTION = 100;

	/**
	 * Zusätzlicher Speicher, den die Instanz zusätzlich verschwendet.
	 */
	private byte[] memory = new byte[INSTANCE_MEMORY_CONSUMPTION];

	/**
	 * Constructor Jede Instanz kommt direkt in die Verwaltung
	 */
	public GCDemo() {
		INSTANCES.put(this, DUMMY_VALUE);
	}

	/**
	 * Gibt die Anzahl der Instanzen zurück, die der GC noch nicht im Auge hat.
	 * 
	 * @return Zahl der Instanzen
	 */
	public static int getInstanceCount() {
		return INSTANCES.size();
	}

	/**
	 * Testmethode Es werden immer 100 Instanzen erzeugt, und dann wird die
	 * Anzahl lebender ausgegeben. TODO: Parametrisierung
	 * 
	 * @param args,
	 *            noch ohne Bedeutung
	 */
	public static void main(String[] args) {
		StringBuffer buf = new StringBuffer(25);
		int lastCount = 0;
		System.out.println("Zeitindex(ms) , Anzahl , Abgeräumt(GC)");
		long startTime = System.currentTimeMillis();
		for (int i = 0; i < 50000; i++) {
			GCDemo instance = new GCDemo();
			if (i % 100 == 0) {
				int count = GCDemo.getInstanceCount();
				buf.append(System.currentTimeMillis() - startTime);
				buf.append(" , ");
				buf.append(count);
				if (count < lastCount) {
					buf.append(" , ");
					buf.append(lastCount - count);
				}
				System.out.println(buf);
				buf.delete(0, 25); //Ausgabespeicher löschen
				lastCount = count;
			}
		}
	}
}

Wenn man die gewonnenen CSV-Daten nach Excel importiert, kann man schön sehen, wann der GC aktiv wird.
Richtig unter Dampf setzt man das Freundchen, wenn man INSTANCE_MEMORY_CONSUMPTION hoch dreht.


Gruß,

Karl
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
J Klassen Instanzen einer Klasse in einer anderen unabhängigen Klasse nutzen Java Basics - Anfänger-Themen 4
G zwei Instanzen einer Klasse Java Basics - Anfänger-Themen 29
C Was machen mit nicht mehr verwendeten Instanzen ? Java Basics - Anfänger-Themen 18
C Instanzen, wann muss ich Instanzen erzeugen & wo?) Java Basics - Anfänger-Themen 23
A Klassen Zugriff auf Instanzen Java Basics - Anfänger-Themen 2
F Mehrere Instanzen der Klasse A EINER Instanz der Klasse B übergeben Java Basics - Anfänger-Themen 3
M Alle Instanzen einer Klasse ansprechen Java Basics - Anfänger-Themen 4
H Erste Schritte JTree: Instanzen einer Klasse speichern oder Namen/Strings... Java Basics - Anfänger-Themen 4
B OOP Summe aus verschiedenen Instanzen einer Klasse berechnen Java Basics - Anfänger-Themen 2
Z Was habe ich davon mit einem Datentyp verschiedene Instanzen zu haben? Java Basics - Anfänger-Themen 6
Q OOP Mehrere Instanzen auf ein Feld Java Basics - Anfänger-Themen 13
G Instanzen eines Interfaces erzeugen Java Basics - Anfänger-Themen 7
S Direkt Instanzen anlegen Java Basics - Anfänger-Themen 1
K Variablen Instanzen gleich aber warum ? Java Basics - Anfänger-Themen 3
D Instanzen durch Methode Java Basics - Anfänger-Themen 14
W Zugriff auf Instanzen von Klassen Java Basics - Anfänger-Themen 8
S aus Text Datei Instanzen erzeugen, so richtig? Java Basics - Anfänger-Themen 4
O Liste aller Instanzen einer Klasse Java Basics - Anfänger-Themen 18
H Klassen Instanzen mit anderen Klassen erzeugen Java Basics - Anfänger-Themen 5
C Referenzen zu Instanzen einer Klasse im Array Java Basics - Anfänger-Themen 8
B Enum: Instanzen Java Basics - Anfänger-Themen 10
M Instanzen vergleichen? Java Basics - Anfänger-Themen 12
H Klassen, Konstruktoren, Instanzen etc Java Basics - Anfänger-Themen 6
W Instanzen, Klassen Java Basics - Anfänger-Themen 2
C Vectorarrays und Instanzen Java Basics - Anfänger-Themen 10
S alle instanzen einer klasse löschen Java Basics - Anfänger-Themen 18
C OOP Instanzen ansprechen Java Basics - Anfänger-Themen 3
P Verständnisfrage zu Instanzen/Objekten Java Basics - Anfänger-Themen 9
B Zugriff auf Variablen in nicht bekannten Instanzen Java Basics - Anfänger-Themen 6
R mit klassen-instanzen arbeiten in packages Java Basics - Anfänger-Themen 10
M Instanzen, Referenzen und Collections Java Basics - Anfänger-Themen 3
A Mehrere Instanzen einer eigenen Klasse in einem Array Java Basics - Anfänger-Themen 5
W mehrere (numerierte) Instanzen erzeugen Java Basics - Anfänger-Themen 3
M Dynamisch Instanzen erstellen. Java Basics - Anfänger-Themen 4
N Instanzen von beliebigen Klassen aus dem Filesystem erzeugen Java Basics - Anfänger-Themen 7
M Problem mit Instanzen von JLabel Java Basics - Anfänger-Themen 4
E Vermeiden,dass mehrere Instanzen eines Java-Programms laufen Java Basics - Anfänger-Themen 2
V mehrere Instanzen gleicher Name möglich? Java Basics - Anfänger-Themen 3
E instanzen von Klassen erzeugen Java Basics - Anfänger-Themen 2
H Instanzen erzeugen und Methoden aufrufen Java Basics - Anfänger-Themen 5
L verschiedene JPanel-Instanzen erstellen Java Basics - Anfänger-Themen 8
K Eindeutige Instanzen von einem Objekt Java Basics - Anfänger-Themen 13
T Wo Daten ablegen für mehrere Servlet-Instanzen? Java Basics - Anfänger-Themen 2
G Instanzen in einem Feld erzeugen Java Basics - Anfänger-Themen 9
J Instanzen dynamisch erzeugen Java Basics - Anfänger-Themen 8
T Instanzen von abstrakten Klassen? Java Basics - Anfänger-Themen 14
D Instanzen einer Klasse Java Basics - Anfänger-Themen 6
G Speicherung von Referenzen auf Instanzen Java Basics - Anfänger-Themen 5
G alle Instanzen einer Klasse serialisieren Java Basics - Anfänger-Themen 4
Silver-Blue mehrere Instanzen einer Klasse, trotz Random immer das Selbe Java Basics - Anfänger-Themen 7
G Instanzen und Referenzen Java Basics - Anfänger-Themen 5
S Instanzen Java Basics - Anfänger-Themen 4
G wenn auch schon oft gefragt (Konstruktor , Instanzen , usw) Java Basics - Anfänger-Themen 6
F Minuten herunterzählen Java Basics - Anfänger-Themen 14

Ähnliche Java Themen

Neue Themen


Oben