Hi,
hoffe das wurde nicht in anderen Threads behandelt - aber da ich mit OutofMemory Problemen, besonders nach Erzeugung von Listen und deren Befüllung, kämpfe hier einmal eine grundsätzliche Frage:
Ich möchte z.B. mit der folgenden Befehlsreihenfolge (kann sein das der Code so nicht funktioniert, schreibe es gerade aus den Kopf, aber das Anliegen sollte verständlich sein) die alte Referenz löschen und mit der neuen Referenz "überschreiben":
Nach meinem Verständniss müsste der GC nun, durch null, wissen das die Referenz nicht mehr benötigt wird und er diese löschen kann. Leider bläht sich das Programm aber nach jedem Aufruf immer weiter auf, egal ob ich die Extra-Parameter aufrufe oder nicht (mit Speicherzuweisungsparameter XS etc. läuft es natürlich länger, der Effekt bleibt aber der gleiche) - sodass man das Gefühl hat das der GC überhaupt nichts löscht.
Hier mal der grundsätzliche Ablauf des Programmes:
a) Thread (Server) wartet auf Anfragen - dieser läuft unendlich lange. Momentan kommen aber keine Clientanfragen rein womit er mit seinem Abarbeitungsserver kommuniziert und Objekte per Socket austauscht.
b) Ein zweiter Thread (Allgemeiner Abarbeitungsthread) wird gestartet. Dieser scannt, in einem neuen Thread, die Datenbanken und führt alle Abarbeitungen durch (Vergleich mit rechteliste, per E-Mail verschicken, Ergebniss an Hauptserver schicken etc.) - dieser wird, mit Hilfe von Quartz, stündlich gestartet und, wenn er fertig ist, beendet. In seinem Hauptthread kommuniziert er mit den Hauptserver.
c) In diesem zweiten Thread markiere ich alle "lokalen Referenzen" explizit. In den weiteren Abarbeitungsfunktion mache ich dies nicht (theoretisch müssten diese dort eh, mit der Entfernung der Hauptreferenz, automatisch mit markiert werden da sie ja zu diesen gehören (Vater - Kind Beziehung) - zu mindestens wenn die Funktion verlassen wird)
d) Alle Objekte werden über Locks synchronisiert. Wenn ein Thread ein Objekt anfordert wird es über einen Stream kopiert (damit er ab da an ohne Probleme damit arbeiten kann und keinen anderen thread - z.B. einen Client der die momentanen Daten abrufen will - behindert oder ein gleichzeitiger Zugriff provoziert wird), wenn es "überschrieben" wird, wird der oben genannte Algorithmus aufgerufen (die bearbeitete Kopie ersetzt in dem Fall das Original Objekt)
Ich denke mal das ich irgendwo ein Verständnissproblem zum garbage Collector habe und hoffe das mir jemand weiterhelfen kann - sollte es Verständnissprobleme bei der Beschreibung des Ablaufs geben bitte melden
Vielen Dank im Voraus und mfG,
RBS2002
hoffe das wurde nicht in anderen Threads behandelt - aber da ich mit OutofMemory Problemen, besonders nach Erzeugung von Listen und deren Befüllung, kämpfe hier einmal eine grundsätzliche Frage:
Ich möchte z.B. mit der folgenden Befehlsreihenfolge (kann sein das der Code so nicht funktioniert, schreibe es gerade aus den Kopf, aber das Anliegen sollte verständlich sein) die alte Referenz löschen und mit der neuen Referenz "überschreiben":
Java:
public void setListe(List neuereferenz)
{
altereferenz.clear(); //Lösche alle Einträge der Liste, zu mindestens das sollte doch Speicher frei räumen
altereferenz = null;
altereferenz = neuereferenz;
}
Nach meinem Verständniss müsste der GC nun, durch null, wissen das die Referenz nicht mehr benötigt wird und er diese löschen kann. Leider bläht sich das Programm aber nach jedem Aufruf immer weiter auf, egal ob ich die Extra-Parameter aufrufe oder nicht (mit Speicherzuweisungsparameter XS etc. läuft es natürlich länger, der Effekt bleibt aber der gleiche) - sodass man das Gefühl hat das der GC überhaupt nichts löscht.
Hier mal der grundsätzliche Ablauf des Programmes:
a) Thread (Server) wartet auf Anfragen - dieser läuft unendlich lange. Momentan kommen aber keine Clientanfragen rein womit er mit seinem Abarbeitungsserver kommuniziert und Objekte per Socket austauscht.
b) Ein zweiter Thread (Allgemeiner Abarbeitungsthread) wird gestartet. Dieser scannt, in einem neuen Thread, die Datenbanken und führt alle Abarbeitungen durch (Vergleich mit rechteliste, per E-Mail verschicken, Ergebniss an Hauptserver schicken etc.) - dieser wird, mit Hilfe von Quartz, stündlich gestartet und, wenn er fertig ist, beendet. In seinem Hauptthread kommuniziert er mit den Hauptserver.
c) In diesem zweiten Thread markiere ich alle "lokalen Referenzen" explizit. In den weiteren Abarbeitungsfunktion mache ich dies nicht (theoretisch müssten diese dort eh, mit der Entfernung der Hauptreferenz, automatisch mit markiert werden da sie ja zu diesen gehören (Vater - Kind Beziehung) - zu mindestens wenn die Funktion verlassen wird)
d) Alle Objekte werden über Locks synchronisiert. Wenn ein Thread ein Objekt anfordert wird es über einen Stream kopiert (damit er ab da an ohne Probleme damit arbeiten kann und keinen anderen thread - z.B. einen Client der die momentanen Daten abrufen will - behindert oder ein gleichzeitiger Zugriff provoziert wird), wenn es "überschrieben" wird, wird der oben genannte Algorithmus aufgerufen (die bearbeitete Kopie ersetzt in dem Fall das Original Objekt)
Ich denke mal das ich irgendwo ein Verständnissproblem zum garbage Collector habe und hoffe das mir jemand weiterhelfen kann - sollte es Verständnissprobleme bei der Beschreibung des Ablaufs geben bitte melden
Vielen Dank im Voraus und mfG,
RBS2002