////
Search

5. JVM Thread, 메모리 정보

Created
2022/09/23 04:39
Tags
JVM

1. Threadm Dump와 Stack Trace 정보

Java 애플리케이션이 실행되면 각각의 스레드는 고유한 Stack 공간을 할당받는다.
Stack에 포함된 정보는 메소드 호출정보가 순서대로 저장이 되고, Primitive 형식의 지역 변수(로컬) 정보가 저장된다.
동적 생성 객체 정보는 Heap에 저장된다.
Call Stack은 메소드가 호출된 순서대로 각각의 스레드마다 순서대로 저장된다.
가장 마지막에 호출되어 실행되고 있는 메소드가 가장 상위에 저장되는 구조이다.
Thread Dump를 생성하면 가장 위에 표시된 메소드가 가장 최근에 수행되고 있는 메소드이며, 아래로 내려갈수록 상위 메소드를 호출한 부모 메소드가 표시된다.
Thread Dump 파일 안에는 Thread가 실행되는지 Block되었는지 등의 실행 상태와 Lock을 보유한 객체 정보 등도 함께 제공한다.
스레드 덤프 파일 생성은 kill -3 <pid>로 생성이 가능하다.

2. Heap 메모리 구조

2.1 Young Generation

신규 생성 객체가 존재하며, Eden, Survive0, Survive1영역으로 나뉘어져 있다.
빠르게 객체가 생겼다가 사라지는 영역이다.
더 이상 참조되지 않는 객체는 Young GC(Minor GC)에 의해 제거된다.

2.2 Old Generation

Young Generation에서 GC 되지않고 살아남은 객체가 이동하는 영역으로 오랫동안 객체가 존재한다.
더 이상 참조되지 않는 객체는 Full GC(Major GC)에 의해 제거된다.

2.3 Permanent Generation, Meraspace

Heap에 있는 객체에 대한 메타데이터 정보가 저장된다.
기본적으로 JVM마다 64MB의 공간을 할당한다.
PermGen 영역은 Heap영역은 아니며, Full GC 발생 시 GC를 통해 메모리가 회수되는 영역이다.

3. Heap Dump 정보

3.1 Heap Dump 파일이란?

Heap Dump는 Java의 Heap메모리에 동적으로 생성된 객체에 대한 정보를 특정 시점에 스냅샷을 뜬 정보다.
생성된 객체와 그의 필드정보를 제공한다.
어떤 스레드가 어떤 Object를 사용하고 있는지에 대한 정보를 함게 파악할 수 있다.
Heap Dump는 특정 시점의 스냅샷정보이기에 언제 객체가 할당되고, 어떤 메소드에 의해 할당되었는지에 대한 정보는 포함하지 않는다.

3.2 Heap Dump 파일은 어디에 사용되는가

Heap Dump 파일을 이용하여 분석하게 되면 OOME가 발생한 Java 애플리케이션에 대해 원인을 분석가능하다.
가장 메모리를 많이 사용하는 객체가 무엇인지 알 수 있다.
Java 애플리케이션에서 메모리 정리를 제대로 하지 않아 시간에 따라 메모리가 점점 증가하는 메모리 누수 현상은 하나의 Heap Dump 파일 가지고는 분석이 쉽지 않다.
전문 프로파일링 도구가 필요하다.
가장 메모리를 많이 사용하고 있는 객체로 부터 Memory Leak을 추정할 수 있다.
2개 이상의 Heap Dump 파일을 비교해보면 메모리 누수 의심 객체를 파악할 수 있다.

3.3 Heap Dump 파일의 종류

Heap Dump 파일의 종류는 크게 IBM과 Sun 계열로 나뉠 수 있다.

IBM 계열

Object의 유형과 크기 및 객체 간의 관계만 포함하고 있다.

Sun 계열

오브젝트 안에 있는 필드에 있는 값을 조사할 수 있고, 덤프 수행 시점의 마지막 실행 메소드도 알 수 있다.
덤프파일의 크기가 크다.

3.4 Heap Dump 파일 생성 방법

jcmd <pid> GC.heap_dump filename=<filename> jmap -dump:live,format=b,file=heapdump.hprof <pid>
Shell
복사
Heap Dump를 수행하게 되면 GC가 수행되고 나서 메모리의 Snapshot을 수행하기에 사용하지 않는 객체는 모두 GC되어 사라지고 Live 객체에 대한 정보만 Snapshot에 저장이 된다.
jmap옵션에 live옵션 빼면 사용하지 않는 객체도 Snapshot이 가능하다.
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=경로
Shell
복사
수동으로 덤프를 만드는것이 아닌 OOME 발생 시 자동으로 덤프를 생성하는 옵션이다.
Heap Dump는 GC의 동반을 수행할 뿐아니라 전체 Heap에 대한 Snapshot을 만드는 과정이므로 애플리케이션이 동작중인 경우에는 주의를 해야한다.

4. 객체 참조

객체는 GC root 객체로부터 참조되면 GC 대상이 아니다.
메모리 누수는 더이상 사용되지 않는 객체가 계속해서 GC root로부터 연결되어 참조가 남아서 GC가 되지 않고 유지되어서 발생한다.

GC root의 종류

System Class Loader에 의해 로딩된 클래스
Live Thread
로컬변수 or 파라미터
JNI 메소드의 로컬변수 또는 파라미터
전역 JNI 참조변수
Monitor로 사용된 객체
JVM이 유지하는 객체: System Class Loader나 Exception 클래스 Custom Class Loader 등등