본문 바로가기
  • 오늘도 한걸음. 수고많았어요.^^
  • 조금씩 꾸준히 오래 가자.ㅎ
IT기술/JAVA

메모리 덤프(dump) 분석 [ jps, jmap ]

by 미노드 2023. 7. 4.

JAVA 어플리케이션을 구동할때 메모리 사용량은 중요하다 static 메모리를 필요 이상으로 많이 사용하거나  힙메모리의 사용량이 이상하게 점점증가해서 메모리 초과가 발생하는 등 메모리 사용량의 이상 동작이 느껴질때는 메모리 덤프를 떠서 직접 확인해보는게 가장 좋다.

물론 더 유용한 도구들도 많겠지만 java-jdk가 깔려있다면 누구나 설치되어있는 가장 기본적인 툴을 사용 할 줄 알아야 추후 어떤 환경에서도 덤프 기능을 원활히 사용 할 수 있을것 같아 jps, jmap을 사용하려 한다.

실제로 내가 사용하는 openJDK 17 버전 기준으로 jmap과 jps가 존재한다.

1. jps 명령어 [pid 확인]

유닉스의 명령어중 'ps'는 현재 실행되고 있는 프로세스들을 표시하는 명령어인데
'jps'명령어는 현재 실행되고있는 JVM 프로세스를 표시해준다.

PS C:\openjdk\jdk-17\bin> jps
4176 Bootstrap
6081 Jps
5208 MonitoringServer
4543 SocketServer

참고. jps -v 옵션을 사용하면 구동시 입력했던 JVM 파라미터도 함께 보여준다.

2. jmap 명령어

jmap명령어는 jvm의 맵을 보여주는 기능을 제공하는 기본 분석 도구이다.
따라서 자바 힙 메모리의 정보를 얻거나 메모리 dump를 떠서 분석을 할 수 있다.

모니터링 서버 덤프 뜨기
jmap -heap 5208
소켓 서버 덤프 뜨기
jmap -heap 4543

덤프를 뜨다보니 에러가 나는 경우도 있다.
왜이럴까?
oracle jdk같은 경우 문제가 발생 하지 않지만 openjdk같은 경우 위와 같은 문제가 발생한다고 한다.
따라서 해결하려면 debug기능을 포함한 jdk패키지를 받으면 된다.
openjdk-17 버전을 사용중이라서 해당 JVM에 맞는 debug패키지를 설치해주면 된다.

패키지명 : openjdk-버전-dbg

https://packages.debian.org/bullseye/openjdk-17-dbg

 

Debian -- Details of package openjdk-17-dbg in bullseye

Java runtime based on OpenJDK (debugging symbols) OpenJDK is a development environment for building applications, applets, and components using the Java programming language. This package contains the debugging symbols.

packages.debian.org

dbg 패키지를 설치후 다시 덤프뜨는 명령어를 실행하면 잘 된다.

보통 덤프 파일을 만들어 분석도구를 통해 보는데,
덤프 파일을 만드는 명령어는 다음과 같다.
덤프파일의 확장자는 일반적으로 .hprof 를 사용한다. 만들때 같이 선언해주자.

## 명령어
$) jmap -dump:file={dump file 이름} PID

소켓서버 덤프 파일 만들기
jmap -dump:file=test.hprof 4543
Dumping heap to /home/kys/test.hprof ...
Heap dump file created

참고!!

jmap의 histo옵션으로 분석도구 없이도 메모리 사용중인 리스트를 볼 수 있는데, 사용방법은 다음과 같다.
아래처럼 표를 보고 특정 클래스가 유별나게 많이 할당되어있다면 해당 소스를 확인 해보면 된다.

jmap -histo 4543