Skip to content

JVM Troubleshooting

정명주(myeongju.jung) edited this page Sep 2, 2019 · 1 revision

Thread

$ kill -3 [pid] > [filename]
$ jstack [pid] > [filename]
  • 쓰레드덤프는 최소 3번 이상 뜬다.
  • 쓰레드덤프는 장애 시 뜬다.

Thread Info

  • 쓰레드 단면 생성 시간 정보
  • JVM에 대한 정보
  • 각 쓰레드의 스텍을 포함한 다양한 정보
  • Deadlock에 대한 정보
  • 힙 영역의 사용 현황 (JDK 6~)
쓰레드 상태 설명 비고
NEW 쓰레드가 아직 시작되지 않은 상태
RUNNABLE 쓰레드가 수행중인 상태 주장애요소
BLOCKED 쓰레드가 잠겨 있어 풀리기를 기다리는 상태 주장애요소
WAITING 다른 쓰레드가 특정 작업을 수행하여 깨울 때까지 무한정 기다리는 상태
TIMED_WAITING 다른 쓰레드가 특정 작업ㅇ르 수행하여 깨울 때까지 지정된 시간만큼 기다리고 있는 상태
TERMINATED 쓰레드가 종료된 상태

툴은 Thread Logic추천

Heap

OutOfMemoryError

java.lang.OutOfMemoryError: Java heap space (heap 메모리 full)

  • 다양한 원인이 있음
  • 주로 memory leak 나 너무 큰 메모리를 요구하는 경우

java.lang.OutOfMemoryError: PermGen space

  • 코드 영역이기 때문에 늘리는게 답
  • -XX:MaxPermSize

java.lang.OutOfMemoryError: Requested array size exceeds VM limit

  • 배열이 너무 클 시

java.lang.OutOfMemoryError: request bytes for . Out of swap space?

  • OS 메모리 부족 시

java.lang.OutOfMemoryError: (Native method)

  • JNI나 Native 코드에서 메모리 할당 오류가 생길 때 발생

기타 메모리 문제

Java 메모리 상태 확인

jstat

vmstat 명령어 처럼 JVM의 메모리 사용량을 확인하는 명령어 $JAVA_HOME/bin 에 존재 jstat -gcutil [pid] 1s: 1초당 Java 메모리 상태 확인

S0 S1 E O M CCS YGC YGCT FGC FGCT GCT
...

ex) YG 영역이 정상인지 비정상인 지는 GC 이후에 60% 이하라면 괜찮다고 판단

jstat -gccapacity [pid]: kb 단위로 java 메모리 상태 확인

MGCNM NGCMX NGC S0C S1C EC OGCNM OGCMX OGC OC PGCNM PGCMX PGC PC YGC FGC
...

HeapDump

jmap

jmap -dump:format=b,file=[filename.hprof] [pid]

gcore

jmap으로 실패할 시

  • gcore 생성: gcore –o [filename] [pid]
  • gcore를 힙덤프로 변환: jmap –dump:format=b,file=[filename] [javabin위치] [gorefilename]

분석툴

자동힙덤프

자바 옵션을 추가하는 것 만으로 OOME가 발생했을 때 자동으로 덤프 생성 가능

  • -XX:+HeapDumpOnOutOfMemoryError
  • -XX:HeapDumpPath=[path]

CPU 모니터링

  • vmstat
  • sar: 통계 정보
  • top: 실시간

vmstat

vmstat 1 5

프로세스 상황

  • ps
  • pstree
  • pmap

Disk I/O

  • df
    • df -kh
  • du
    • du --max-depth=2 /run: /run 이라는 디렉토리 사용량 확인
  • iostat
    • iostat -x
    • iostat -xd
  • lsof
    • lsof | grep [pid]: 해당 PID가 쓰고 있는 파일명을 알 수 있음
Clone this wiki locally