# Speicher reservieren



## Stefan_Schottland (9. Mrz 2004)

Hallo zusammen,

ich moecht eure Meinung zu folgendem Thema hoeren:

Fuer eine Instrument zum Messen von Bewegungen von Personen muss ich ein Java Programm schreiben.
Das ganze soll in Echtzeit ablaufen. Es wird kein Real-Time Java verwendet.
Wie jeder weiss ist normales Java nicht fuer Real-Time anwendungen geeignet. Der Garbage-Collector hat 
nunmal die hoechste Prioritaet und funkt einem immer dann dazwischen wenn man es nicht brauchen kann.
Die Philosophie meines Arbeitgebers ist es einefach waehrend ein Prozess laueft (while(true)-Schleife) einfach
kein "new" zu machen. wo kein Speicher allociert wird kann auch keiner aufgeraeumt werden.

Nun meine eigentliche Frage:
Wenn ich zum Beispiel am Anfang (Konstruktor) eines Prozesses ein Array allocciere 
(Person[] arr = new Person[10]) wie wird dann der Speicher reserviert. Vor allem wie laeuft das wenn ein Objejt
vom typ Person selber noch irgendwelche Collections beherbergt. Dann kann man ja gar nicht wissen wieviele
Bytes das Array beansprucht. Oder allocciere ich etwa nur ein Arry aus Pointern auf Person Objecte?

Fragen ueber Fragen. Ich hoffe ihr koennt mir helfen.

Gruesse aus Schottland,

Stefan


----------



## bygones (9. Mrz 2004)

wegen den Collections:
Das hängt davon ab. Z.b Vectoren sind nichts anderes als Arrays für Java. Wenn du einen Vector erzeugst ohne die Kapazität festlegst. Alloziert er erst für 10 Objekte (meines Wissens vom Typ Object). Hast du 10 Objekte eingefügt wird der Array vergrößert (ich glaube default ist doppelt so groß) und es beginnt schönes rumkopieren. (du kannst natürlich auch von anfang an die Größe festlegen)
Anders z.B. bei LinkedList: das kannst du soviele Objekte wie möglich hinzufügen, da einfach nur die Links in der Liste "umgehängt" werden....
(ohne Gewähr).

Aber ehrlich gesagt würde ich nicht auf 100% Echtzeit setzen, keine Ahnung wie sich der GC doch mal einschaltet und nur überprüft ob er was zu tun hat....

Gruß aus England


----------



## schalentier (9. Mrz 2004)

Also erstmal hast du keinen Einfluss auf das Verhalten des GCs. Von Sun ist meines Wissens nach nur vorgegeben, dass da ein GarbageCollector sein soll, da java keine mittel bereitstellt um speicher frei zu geben. 
Wann der GC, was macht und ob er das ueberhaupt tut, ist alleine davon abhaengig, welche vm du einsetzt. es gibt zwar eine Methode (ich glaub bei System oder so), mit der du den gc aufrufen kannst, allerdings ist nirgendwo spezifiziert, was da passiert. 
Also ist es relativ egal, ob du in einer schleife neue objekte erzeugst oder auch nicht. generell gilt natuerlich, was ausserhalb einer schleife geht, das mach auch ausserhalb.

Die Klasse Vector hat nix mit Arrays zu tun (kann sein, dass ich meinen vorredner falsch verstanden habe). Vector ist die einzige Klasse des Java Collection Frameworks die (thread)synchronisiert ist. damit ist Vector grundsaetzlich langsamer als ein normales Array. Ausserdem ist Vector (zumindest im aktuellen java) nicht getypt, ein array schon. 

die anweisung Person[] arr = new Person[10] initialisiert keine Instanzen von Person, sondern legt ein Feld an, in welches 10 Referenzen von Personenobjekten passen. Man kann dieses array nicht nachtraeglich vergroessern (ausser durch rumkopieren). Es werden also nur 10 "pointer" erzeugt. 

gl&hf


----------



## bygones (9. Mrz 2004)

schalentier hat gesagt.:
			
		

> Die Klasse Vector hat nix mit Arrays zu tun (kann sein, dass ich meinen vorredner falsch verstanden habe). Vector ist die einzige Klasse des Java Collection Frameworks die (thread)synchronisiert ist. damit ist Vector grundsaetzlich langsamer als ein normales Array. Ausserdem ist Vector (zumindest im aktuellen java) nicht getypt, ein array schon.


Ich meinte die Klasse Vector so implementiert, dass sie eigentlich nur ein Array ist (zu sehen im source code von java) !!


----------



## Beni (9. Mrz 2004)

Du solltest Dir aber auch überlegen, wie du die Arbeit des GC's beschleunigen kannst.

- Nicht mehr gebrauchte Variablen auf *null* setzen.
- alte, nicht mehr gebrauchte Objekte sammeln, und später neu füllen (anstelle eines *new*)
- Objekte mehrmals verwenden (5 mal "Arial, schwarz, fett, 15" initialisieren ist falsch...)


----------



## Stefan_Schottland (9. Mrz 2004)

Danke fuer eure Hilfe!

Jetzt weiss ich dass ich wie immer doch vom schlimmsten ausgehen muss.

Gruesse,
Stefan


----------

