Descreva o bug
Quando uma instância de ServiceBusReceiverAsyncClient
é criada, dois campos de instância LockContainer
são criados.
Cada variável (no construtor de LockContainer
) se inscreve no Flux para limpar recursos periodicamente. O lambda usado na limpeza usa a própria instância do contêiner de bloqueio, então o Flux continuará referenciando a instância do contêiner de bloqueio até que o consumidor seja descartado.
O problema é que quando ServiceBusReceiverAsyncClient
é fechado, as variáveis LockContainer
não estão sendo fechadas também, o que causa um vazamento de memória.
Reproduzir
Para reproduzir, crie uma instância ServiceBusReceiverAsyncClient
e chame repetidamente close
e start
. Use o Visual VM para rastrear o uso de memória com despejos de heap.
Este é o padrão de uso de memória que você deve ver (um aumento leve, mas constante no uso de memória):
E é assim que o número de instâncias no heap e seus tamanhos retidos serão parecidos com o tempo:
Comportamento esperado
As instâncias do LockContainer devem ser fechadas quando o cliente é fechado e, portanto, não vazam para a memória.
Configuração (preencha as seguintes informações):
Lista de verificação de informações
Certifique-se de ter adicionado todas as informações a seguir acima e verifique os campos obrigatórios, caso contrário, trataremos o emissor como um relatório incompleto
Olá, acabei de abrir um PR com uma correção para esse problema: https://github.com/Azure/azure-sdk-for-java/pull/17993.
Por favor, deixe-me saber se você precisar de alguma mudança ou mais informações.
Atenciosamente!
Obrigado por verificar o PR @conniey ! Podemos esperar um novo lançamento em breve? Atenciosamente!
@marciopd teremos um lançamento em janeiro.
Corrigido por # 17993