Memory-Leak in BlockingQueue

qwer1234

Mitglied
Servus,

Ich hätte mal wieder eine Frage:
Ich habe einen Server-Thread, der mir Daten produziert und einen Client der diese dann abholt. Das ganze funktioniert mittlels einer eigenen Queue, die intern eine ArrayBlockingQueue verwendet.

Bricht jetzt während des Produzierens der Client weg, produziert der Server bis die Queue voll ist (ich verwende put zum belegen) und dann steht er im await() der ArrayBlockingQueue.

Damit meine Queue irgendwann garbageCollected werden kann hab ich sie nur weak referenziert.
Wird diese nun tatsächlich irgendwann collected, bleibt die interne ArrayBlockingQueue aber stehen und ebenso der Server-Thread.
kann ich irgendwie dafür sorgen, dass sowohl die ArrayBlockingQueue als auch mein ProducerThread aufgeräumt werden ohne dass ich von put abweiche?

Vielen Dank schon mal
 
Sieht so aus als ob deine Datenstruktur nicht passt. Was du brauchen könntest ist ein FIFO (FirstInFirstOut) der, wenn er voll ist, die ältesten Einträge überschreibt. Würde das nicht dem GC überlassen...
 
Damit meine Queue irgendwann garbageCollected werden kann hab ich sie nur weak referenziert. 😵
Das ist aber fail, das heist wenn wenig ram zur verfügung ist/ full gc läuft werden dir die daten unterm ***** weggeschossen obwohl noch nen client da ist.

Was soll den passieren in so einem fall?
Der server weiterlaufen und die ältesten daten überschreiben? -> sieh über mir

Der server nicht blockieren aber die daten so lassen? -> nicht put nehmen sondern offer
The offer method inserts an element if possible, otherwise returning false.


Der server nicht blockieren und alle Daten lösen? -> offer und clear wenn false returnt.
 
Zuletzt bearbeitet:
So, ich hab das ganze jetzt intern auf offer umgestellt.
Java:
while (!blockingQueue.offer(e, 1, TimeUnit.SECONDS)) {
            try {
                Thread.sleep(1000);
            } catch (InterruptedException ex) {
                // ignore

            }
        }

Die Idee war jetzt, da nur noch 2 WeakReferences auf meine Queue bestehen kann das ganze dann garbage collected werden, da ich auch nicht mehr gelockt in der ArrayBlockingQueue hängen bleibe.
Oder kann ich immer noch nicht aufgeräumt werden, weil ich in der Klasse selber festhänge?
 

Zurück
Oben