# alle instanzen einer klasse löschen



## skywalker (24. Sep 2010)

kann man in java alle instanzen einer klasse händisch löschen?

ich benötige ca. 1000 instanzen einer klasse temporär und möchte diese dann nachdem ich die verwendet hab gleich wieder löschen und nicht auf den garbage collector warten. geht das?


----------



## Noctarius (24. Sep 2010)

Wenn du den Scope richtig setzt kümemrt sich der Garbage Collector schon darum, dass sauber aufgeräumt wird. Du hast nur dafür zu sorgen, dass alle Referenzen verschwunden sind.

Den Instanzen-Scope einfach immer so klein wie möglich halten und fertig.


----------



## ?!?!? (24. Sep 2010)

instanzen = null;


----------



## Der Müde Joe (24. Sep 2010)

Nein.
Man kann höchsten ein System.gc() machen, um den GC anzustossen (wobei das auch keine Garantie ist, das er läuft).

(In der Forensuche findet man bestimm schon x Threads darüber)


----------



## Noctarius (24. Sep 2010)

?!?!? hat gesagt.:


> instanzen = null;



Das löscht keine Instanz sondern löscht eine Referenz auf eine Instanz.


----------



## ?!?!? (24. Sep 2010)

Hmm, hätte mal die frage richtig lesen sollen ^^


----------



## Volvagia (24. Sep 2010)

Nein. Du kannst zwar den GC bitten, anfangen zu arbeiten, aber das ist kein Befehl. Laut FindBugs sollte man das auch nicht tun.



> Explicit garbage collection; extremely dubious except in benchmarking code
> Code explicitly invokes garbage collection. Except for specific use in benchmarking, this is very dubious.
> In the past, situations where people have explicitly invoked the garbage collector in routines such as close or finalize methods has led to huge performance black holes. Garbage collection can be expensive. Any situation that forces hundreds or thousands of garbage collections will bring the machine to a crawl.



Wenn ich das richtig verstehe, soll der GC selbststänidg langsam nacheinander alles entfernen. Wofür braucht man eigendlich 1000 temponäre Instanzen?


----------



## Noctarius (24. Sep 2010)

Och es kann schnell vorkommen, dass man 1000 temporäre Instanzen von etas braucht. Z.B. XML einlesen und Daten analysieren. Wenn ich die danach nicht mehr brauche sind sie temporär ^^

Und es stimmt, generell sind die GC Algos so gut, dass ein expliziter Aufruf des GC vermieden werden sollte.


----------



## skywalker (24. Sep 2010)

die 1000 einträge sollen nur einträge für einen buffer sein. wobei die anzahl der einträge variieren können.

jez hab ich eine klasse gemacht mit einem konstruktor der die einräge zusammenführt (z.b. ein eintrag= gelb, 20, 2.2, false)
und eine zweite klasse buffer wo verschiedene sortieralgorithmen für die einträge sind und die dann auch  von einer ganz anderen klasse abgefragt wird ob eine bestimmte anzahl von einträgen erreicht wird und dann einen bestimmten eintrag zurückliefern soll...


----------



## Noctarius (24. Sep 2010)

Hä? Noch mal in deutsch bitte


----------



## Landei (24. Sep 2010)

Da kommt mir das Flyweight Pattern in den Sinn.

Wenn du immer nur eine bestimmte Anzahl deiner Objekte brauchst, wäre auch Pooling eine Lösung: Du hältst eine Anzahl Objekte in einer Collection. Um sie zu benutzen, nimmt man sie aus der Collection heraus. Statt mit einem Konstruktor werden sie über eine Init-Methode initialisiert, und am Ende nicht gc'd, sondern für die Wiederverwendung vorbereitet, indem man sie wieder in die Collection packt.


----------



## skywalker (24. Sep 2010)

klasse 1 = buffer eintrag. ein eintrag besteht aus unterschiedlichen typen (z.b. string, long, double, long)

klasse 2 = speichert die  einträge in einer liste. wie kann ich der klasse die den buffer darstellt die einträge übergeben ohne jedesmal eine new klasse1 zu machen. momentan gibt es in der klasse2 nämlich eine addToBuffer funktion die als parameter eine new klasse2(string, long, double,long) hat - ich möchte aber nicht immer eine neue klasse erzeugen - wegen performance bzw weils mir überhaupt seltsam vorkommt. und wenn ich da schon immer neue instanzen anlege möcht ich die dann wenn der buffer gefüllt ist sofort löschen.


----------



## Noctarius (24. Sep 2010)

Der Buffer ist also eine art Queue oder Stack?


----------



## Volvagia (24. Sep 2010)

Du könntest eventuell für jedes Parameter eine ArrayList erstellen, und nur in einer Instanz speichern. Dann erspaarst du dir n - 1 Instanzen, ich weiß aber nicht ob das so einen großen Vorteil bringt.


```
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public class Klasse
{
	private final Lock PARM_0_LOCK = new ReentrantLock();
	private final Lock PARM_1_LOCK = new ReentrantLock();
	private final Lock PARM_2_LOCK = new ReentrantLock();

	private List<String> parm0List;
	private List<String> parm1List;
	private List<String> parm2List;
	
	public Klasse()
	{
		super();
		parm0List = new ArrayList<String>();
		parm1List = new ArrayList<String>();
		parm2List = new ArrayList<String>();
	}
	public void setParm0(String parm, int typ)
	{
		PARM_0_LOCK.lock();
		try
		{
			if(parm0List.size() < typ)
				parm0List.add(typ, parm);
			else
				parm0List.set(typ, parm);
		}
		finally
		{
			PARM_0_LOCK.unlock();
		}
	}
	public void setParm1(String parm, int typ)
	{
		PARM_1_LOCK.lock();
		try
		{
			if(parm1List.size() < typ)
				parm1List.add(typ, parm);
			else
				parm1List.set(typ, parm);
		}
		finally
		{
			PARM_1_LOCK.unlock();
		}
	}
	public void setParm2(String parm, int typ)
	{
		PARM_2_LOCK.lock();
		try
		{
			if(parm2List.size() < typ)
				parm2List.add(typ, parm);
			else
				parm2List.set(typ, parm);
		}
		finally
		{
			PARM_2_LOCK.unlock();
		}
	}
	
	public String getParm0(int typ)
	{
		return(parm0List.get(typ));
	}
	public String getParm1(int typ)
	{
		return(parm1List.get(typ));
	}
	public String getParm2(int typ)
	{
		return(parm2List.get(typ));
	}
}
```

(Vom Hirn in Eclipse)


----------



## skywalker (24. Sep 2010)

ja der buffer is so eine art stack - und wenn eine gewisse anzahl an einträgen im buffer steht soll damit mit einem eintrag der von allen aussortiert wird weitergearbeitet werden.


----------



## Noctarius (24. Sep 2010)

Ein zufälliger? OoKlingt spontan ziemlich sinnfrei, dann kann ich gleich einen zufälligen Wert erstellen


----------



## skywalker (24. Sep 2010)

wie meinst zufälliger?

in den buffer werden zb 1000 einträge geschrieben, ein eintrag wird dann aufgrund eines bestimmten kriteriums ausgewählt und mit dem weitergerechnet... wenn ich 1000 einträge im buffer hab, sortiert wurde und ich den einen eintrag habe, möchte ich alle 1000 einträge (was bis jetz 1000 neue klassen1 sind) löschen - ich möcht die klassen im speicher löschen, nicht den buffer leeren, oder referenzen auf die klasse löschen.


----------



## Noctarius (24. Sep 2010)

Kannst du das Kriterium denn nicht als eine Art Filter direkt überprüfen? Müssen die Werte unbedingt zwischengespeichert sein?


----------



## skywalker (24. Sep 2010)

also ein eintrag in dem buffereintag is ein long wert.

zb. buffereitrag1 = (gelb, 12, 4.0, 234344)
zb. buffereintrag2 = (lila, 3,7.5, 12)
....

es soll schon gefiltert werden - und zwar der niedrigste longwert an der letzten stelle ist der gesuchte buffereintrag. also es geht ja eigentlich um die filterung.

momentan merk ich mir halt die einträge, wenn max_einträge da sind dann sortier ich nach dem longwert an letzter stelle und hol mir den eintrag mit dem niedrigsten longwert an letzter stelle (buffereintrag2), von dem ich dann den z.b zweiten wert brauch (3) um was anderes zu machen...


----------

