Décrivez le bogue
Lorsqu'une instance de ServiceBusReceiverAsyncClient
est créée, deux champs d'instance LockContainer
sont créés.
Chaque variable (dans le constructeur de LockContainer
) s'abonne à Flux afin de nettoyer périodiquement les ressources. Le lambda utilisé dans le nettoyage utilise l'instance de conteneur de verrouillage elle-même, de sorte que Flux continuera à référencer l'instance de conteneur de verrouillage jusqu'à ce que le consommateur soit éliminé.
Le problème est que lorsque ServiceBusReceiverAsyncClient
est fermé, les variables LockContainer
ne sont pas également fermées, ce qui provoque une fuite de mémoire.
Reproduire
Pour reproduire, créez une instance ServiceBusReceiverAsyncClient
et appelez à plusieurs reprises close
et start
. Utilisez Visual VM pour suivre l'utilisation de la mémoire avec les vidages de tas.
Voici le modèle d'utilisation de la mémoire que vous devriez voir (une augmentation légère mais constante de l'utilisation de la mémoire) :
Et voici à quoi ressembleront le nombre d'instances dans le tas et leurs tailles conservées dans le temps :
Comportement prévisible
Les instances de LockContainer doivent être fermées lorsque le client est fermé et ne doivent donc pas fuir dans la mémoire.
Configuration (veuillez compléter les informations suivantes) :
Liste de contrôle des informations
Veuillez vous assurer que vous avez ajouté toutes les informations suivantes ci-dessus et cochez les champs requis, sinon nous traiterons l'émetteur comme un rapport incomplet.
Bonjour, je viens d'ouvrir un PR avec un correctif pour ce problème : https://github.com/Azure/azure-sdk-for-java/pull/17993.
S'il vous plaît laissez-moi savoir si vous avez besoin de changements ou de plus d'informations.
Meilleures salutations!
Merci d'avoir vérifié le PR @conniey ! Peut-on s'attendre à une nouvelle version bientôt ? Meilleures salutations!
@marciopd nous aurons une sortie en janvier.
Corrigé par #17993