Beschreibe den Fehler
Wenn eine Instanz von ServiceBusReceiverAsyncClient
erstellt wird, werden zwei LockContainer
Instanzfelder erstellt.
Jede Variable (im Konstruktor von LockContainer
) abonniert Flux, um regelmäßig Ressourcen zu bereinigen. Das bei der Bereinigung verwendete Lambda verwendet die Sperrcontainerinstanz selbst, sodass Flux weiterhin auf die Sperrcontainerinstanz verweist, bis der Consumer verworfen wird.
Das Problem ist , dass , wenn ServiceBusReceiverAsyncClient
geschlossen ist , der LockContainer
Variablen nicht auch geschlossen werden, die einen Speicherverlust verursacht.
Fortpflanzen
Um zu reproduzieren, erstellen Sie eine ServiceBusReceiverAsyncClient
Instanz und rufen Sie wiederholt close
und start
. Verwenden Sie Visual VM, um die Speichernutzung mit Heap-Dumps zu verfolgen.
Dies ist das Muster der Speichernutzung, das Sie sehen sollten (ein leichter, aber stetiger Anstieg der Speichernutzung):
Und so werden die Anzahl der Instanzen im Heap und ihre beibehaltenen Größen im Laufe der Zeit aussehen:
Erwartetes Verhalten
LockContainer-Instanzen sollten geschlossen werden, wenn der Client geschlossen wird und daher nicht in den Speicher gelangen.
Einrichtung (bitte füllen Sie die folgenden Informationen aus):
Informations-Checkliste
Bitte stellen Sie sicher, dass Sie alle folgenden Informationen oben angegeben haben und kreuzen Sie die erforderlichen Felder an, andernfalls behandeln wir den Aussteller als unvollständigen Bericht
Hallo, ich habe gerade eine PR mit einem Fix für dieses Problem geöffnet: https://github.com/Azure/azure-sdk-for-java/pull/17993.
Bitte lassen Sie mich wissen, wenn Sie Änderungen oder weitere Informationen benötigen.
Mit freundlichen Grüßen!
Danke fürs Überprüfen der PR @conniey ! Können wir bald mit einer neuen Veröffentlichung rechnen? Mit freundlichen Grüßen!
@marciopd wir werden im Januar eine Veröffentlichung haben.
Behoben von #17993