Condivisione della tecnologia

Idee per la risoluzione dei problemi relativi alla perdita di memoria off-heap e condivisione dei casi

2024-07-12

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

Riferimenti:

①Utilizzare mtrace per tenere traccia delle perdite di memoria off-heap della JVM

②Un caso di risoluzione dei problemi relativo all'utilizzo elevato della memoria Java

1. Idee per l'indagine

Ottenere la posizione della perdita di memoria (vedere i materiali di riferimento ① per i comandi dettagliati)

  1. Utilizzare jna per abilitare mtrace nel codice Java per tenere traccia dell'allocazione della memoria

  2. Utilizzare il comando mtrace per analizzare i file di registro e ottenere punti di chiamata di perdita di memoria.

  3. arthas controlla lo stack di chiamate del punto chiamata con perdita di memoria (è possibile utilizzare direttamente l'indirizzo del punto chiamata, non è richiesto alcun nome di funzione)

Ottieni il contenuto della perdita di memoria (vedi i materiali di riferimento ② per i comandi dettagliati)

  1. Eseguire il comando pmap per la prima volta per ottenere l'utilizzo della memoria del processo Java
  2. Dopo un periodo di tempo, la memoria aumenta. Eseguire nuovamente il comando pmap per ottenere l'utilizzo della memoria del processo Java.
  3. Utilizza lo strumento di confronto testo per confrontare l'output dei due comandi pmap prima e dopo
  4. Transcodifica per visualizzare il contenuto dei dati della memoria appena aggiunta

2. Condivisione dei casi

Quando si testa un servizio offline, quando il QPS è elevato, la memoria occupata dall'area nio.directbuffer della macchina aumenterà improvvisamente, provocando la comparsa di OOM nel contenitore.

Utilizzando le idee per la risoluzione dei problemi di cui sopra, abbiamo finalmente stabilito che il nostro framework RPC generava una grande quantità di dati nell'area del directbuffer. Infatti, quando il QPS è elevato, il numero di thread di selezione è piccolo e la capacità di consumo è insufficiente, determinando un backlog di dati di richiesta e risposta nell'area del directbuffer.