기술나눔

오프힙 메모리 누수 문제 해결 아이디어 및 사례 공유

2024-07-12

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

참고자료:

①mtrace를 사용하여 JVM 오프힙 메모리 누수 추적

②Java 메모리 사용량이 많은 문제 해결 사례

1. 조사 아이디어

메모리 누수 위치 획득(자세한 명령은 참고 자료 ① 참조)

  1. jna를 사용하여 Java 코드에서 mtrace를 활성화하여 메모리 할당 추적

  2. 로그 파일을 분석하고 메모리 누수 호출 지점을 얻으려면 mtrace 명령을 사용하십시오.

  3. arthas는 메모리 누수 콜포인트의 호출 스택을 확인합니다. (콜 포인트 주소를 직접 사용할 수 있으며 함수 이름은 필요하지 않습니다.)

메모리 누수 내용 획득(자세한 명령은 참고 자료 ② 참조)

  1. Java 프로세스의 메모리 사용량을 얻기 위해 처음으로 pmap 명령을 실행합니다.
  2. 일정 시간이 지나면 메모리가 증가합니다. Java 프로세스의 메모리 사용량을 얻으려면 pmap 명령을 다시 실행하십시오.
  3. 텍스트 비교 도구를 사용하여 두 pmap 명령의 출력 전후 비교
  4. 새로 추가된 메모리의 데이터 콘텐츠를 보기 위한 트랜스코드

2. 사례 공유

오프라인으로 서비스를 테스트할 때 QPS가 높으면 머신의 nio.directbuffer 영역이 차지하는 메모리가 갑자기 늘어나 컨테이너에 OOM이 발생하게 됩니다.

위의 문제 해결 아이디어를 사용하여 마침내 RPC 프레임워크가 다이렉트버퍼 영역에서 많은 양의 데이터를 생성한다는 것을 확인했습니다. 실제로 QPS가 높을 경우 셀렉터 스레드 수가 적어 소비 용량이 부족해 다이렉트버퍼 영역에 요청 및 응답 데이터의 백로그가 발생하게 된다.