Compartilhamento de tecnologia

Ideias para solução de problemas de vazamento de memória fora da pilha e compartilhamento de casos

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

Referências:

①Use mtrace para rastrear vazamentos de memória fora do heap da JVM

②Um caso de solução de problemas de alto uso de memória Java

1. Ideias de investigação

Obtenha o local do vazamento de memória (consulte os materiais de referência ① para comandos detalhados)

  1. Use jna para ativar o mtrace no código Java para rastrear a alocação de memória

  2. Use o comando mtrace para analisar arquivos de log e obter pontos de chamada de vazamento de memória.

  3. arthas verifica a pilha de chamadas do ponto de chamada de vazamento de memória (você pode usar o endereço do ponto de chamada diretamente, nenhum nome de função é necessário)

Obtenha conteúdo de vazamento de memória (consulte os materiais de referência ② para comandos detalhados)

  1. Execute o comando pmap pela primeira vez para obter o uso de memória do processo Java
  2. Após um período de tempo, a memória aumenta Execute o comando pmap novamente para obter o uso de memória do processo Java.
  3. Use a ferramenta de comparação de texto para comparar a saída dos dois comandos pmap antes e depois
  4. Transcodifique para visualizar o conteúdo dos dados da memória recém-adicionada

2. Compartilhamento de casos

Ao testar um serviço offline, quando o QPS está alto, a memória ocupada pela área nio.directbuffer da máquina aumentará repentinamente, fazendo com que ocorra OOM no contêiner.

Usando as ideias de solução de problemas acima, finalmente determinamos que nossa estrutura RPC gerou uma grande quantidade de dados na área do directbuffer. Na verdade, quando o QPS é alto, o número de threads seletores é pequeno e a capacidade de consumo é insuficiente, resultando em um backlog de dados de solicitação e resposta na área do directbuffer.