Describe el error
Cuando se crea una instancia de ServiceBusReceiverAsyncClient
se crean dos campos de instancia LockContainer
.
Cada variable (en el constructor de LockContainer
) se suscribe a Flux para limpiar los recursos periódicamente. La lambda utilizada en la limpieza usa la instancia del contenedor de bloqueo en sí, por lo que Flux seguirá haciendo referencia a la instancia del contenedor de bloqueo hasta que se elimine el consumidor.
La cuestión es que cuando ServiceBusReceiverAsyncClient
está cerrado, los LockContainer
variables que no están siendo también cerraron, lo que provoca una pérdida de memoria.
Reproducir
Para reproducir, cree una instancia ServiceBusReceiverAsyncClient
y llame repetidamente a close
y start
. Utilice Visual VM para realizar un seguimiento del uso de la memoria con volcados de pila.
Este es el patrón de uso de la memoria que debería ver (un aumento leve pero constante en el uso de la memoria):
Y así es como se verán en el tiempo la cantidad de instancias en el montón y sus tamaños retenidos:
Comportamiento esperado
Las instancias de LockContainer deben cerrarse cuando el cliente está cerrado y, por lo tanto, no se filtran a la memoria.
Configuración (complete la siguiente información):
Lista de verificación de información
Por favor, asegúrese de haber agregado toda la siguiente información arriba y marque los campos obligatorios; de lo contrario, trataremos al emisor como un informe incompleto.
Hola, acabo de abrir un PR con una solución para este problema: https://github.com/Azure/azure-sdk-for-java/pull/17993.
Por favor, avíseme si necesita algún cambio o más información.
¡Atentamente!
¡Gracias por consultar el PR @conniey ! ¿Podemos esperar un nuevo lanzamiento pronto? ¡Atentamente!
@marciopd tendremos un lanzamiento en enero.
Corregido por # 17993