자바 어플리케이션 실행 중 장애 발생 시 원인을 찾을 수 있는 방법은 여러가지가 있다.
로그분석, 스레드 덤프 & 힙덤프 분석, 예외 핸들링, 성능 모니터링, 코드 검토, 모니터링 툴 활용 등이 있다.
이 중 스레드 덤프와 힙 덤프에 대해 알아보고자 한다.
Thread Dump 란?
=> 실행 중인 Java 어플리케이션의 모든 스레드 상태 출력
=> 어플리케이션이 멈춤 상태에서 생성
=> 어플리케이션의 데드락(Deadlock) 이나 스레드 문제를 분석하거나 성능 문제를 해결하는 데 도움 됨
=> 스레드 덤프 생성 시 PID (Process ID)를 알아야 함
* 덤프 생성
==> kill -3 <PID> 명령어를 통하여 덤프를 생성한다 . (Visual VM 으로도 획득 가능)
==> 덤프에는 표준출력(stdout), 로그파일(catalina.out, stout.log)에 기록됨
==> PID 획득 방법 : ps -ef
* 스레드 덤프 내용
"pool-1-thread-13" prio=6 tid=0x000000000729a000 nid=0x2fb4 runnable [0x0000000007f0f000]
// "pool-1-thread-13" : 스레드 이름
// prio=6 : 우선순위
// tid=0x000000000729a000 nid=0x2fb4 : 스레드 ID
// runnable [0x0000000007f0f000] : 스레드 상태
* 참고
=> 스레드 덤프는 획득 당시의 스레드 상태만 알 수 있기 때문에
상태 변화 확인을 위해 5초 간격으로 5~10회 정도 획득 하는 것이 좋음
* 스레드 덤프 유형별 패턴
https://d2.naver.com/helloworld/10963
Heap Dump 란?
=> Java 어플리케이션의 메모리 상태를 스냅샷 형태로 저장
=> 메모리 누수(Memory Leak)나 객체분석에 유용(메모리 누수 발생 시 주기적으로 재기동 하며 clear 시켜주며 로그 확인)
=> 힙 덤프 생성 시 PID를 알아야 함
* 덤프 생성
==> jmap -dump:format=b,file=<dump-file> <PID> 명령어를 통해 덤프 생성
==> ' <dump-file> ' 는 생성된 힙 덤프 파일의 경로와 이름을 지정
ex) $ jamp -dump:live,format=b,file=/tmp/dump.hprof [PID]
:live = 동작중인 인스턴스만 캡쳐
=> $ export IBM_HEAPDUMP=true 또는 export IBM_HEAP_DUMP=true 옵션 설정 필요
==> 일반적으로 .hprof 확장자를 가짐
** OOM (Out Of Memory) 발생 시 자동 생성
==> oracle : java -XX:HeapDumpOnOutOfMemoryError 옵션 필요
==> IBM : export JAVADUMP_OUTOFMEMORY=true 옵션 필요
추가로
GC Log 란?
=> Garbage Collector 동작과 메모리 관리에 대한 로깅 정보 제공
=> GC 로그는 메모리 할당, 객체 수집, 힙 크기 등과 관련된 세부 정보를 기록하여 어플리케이션의 메모리 사용량 및 GC 성능을 분석함
* 로그 생성
==> Java 어플리케이션을 실행할 때 JVM 인자(-Xloggc:<log-file> 또는 -verbose:gc 등) 를 사용하여 GC 로그를 활성화
==> <log-file> 은 생성된 GC 로그 파일의 경로와 이름 짖ㅇ
GC 로그 읽는법
Dump 모니터링 툴
VisualVM | - Java 어플리케이션의 실행 상태, 메모리 사용, 스레드, GC 등을 모니터링 할 수 있음 - 스레드 덤프, 힙 덤프, CPU 프로파일링 등 제공 |
GC Viewer | - GC 로그 파일을 읽어 이벤트, 메모리 사용, 시간 등을 그래프로 표시해줌 |
Eclipse Memory Analyzer | - Heap Dump 를 분석하고 메모리 누수, 객체 참조 문제, 큰 객체 등을 식별할 수 있음 |
참고
https://hpotter1993.tistory.com/24
'WEB WAS > 미들웨어' 카테고리의 다른 글
GC (Garbage Collection) Thread 설정 (0) | 2023.06.07 |
---|---|
톰캣 access.log, catalina.out (구성, 용량 설정) (0) | 2023.06.07 |
Connection pool (0) | 2023.06.07 |
mod_jk.so (Apache Tomcat Connector 모듈 파일) (0) | 2023.06.07 |
[CentOS 7] 아파치, 톰캣 연동 (mod_jk, Cent OS, Tomcat Connector) (1) | 2023.06.07 |