Please Enable JavaScript!
Mohon Aktifkan Javascript![ Enable JavaScript ]

Java Garbage Collector

2021. 9. 1. 10:18programming/java

728x90

Heap 분석 사이트 : https://heaphero.io/

 

java process  outofmemory 되면 heapmemory 덤프

-XX:-HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=./java_pid<pid>.hprof

 

 

$ jstat -gcutil -h5 22757(pid입력) 1000
 
 
gc가 발생한 원인 출력
$ jstat -gccause -h10 22757 1000
 
/home1/irteam/apps/jdk1.8/bin/jstat -gccause -h10 22757 1000

jstat -gcutil을 이용하면 현재 Young 영역과 Old 영역의 메모리 사용률을 확인할 수 있음.

S0 : S0 영역 사용율
S1 : S1 영역 사용율
E : Eden 영역 사용율
O : Old 영역 사용율
M : Meta 영역 사용율
CCS : Compressed Class Space 영역 사용율
YGC : Young Generation의 GC 이벤트 발생 횟수
YGCT : Yong Generation의 GC 수행 누적 시간
FGC : Full GC 횟수
FGCT : Full GC에 걸린 시간
GCT : GC에 걸린시간(YGCT + FGCT)

 

쓰레드 덤프

jstack 15422 >> dump2.log

 

힙덤프

$ jmap -dump:format=b,file=heapdump.20200610.hprof 22757

 

가비지 컬렉션에서 더 이상 사용되지 않는의 의미는 Unreachable object라고 말할 수 있다.

Unreachable object들은 Stack에 도달할 수 없는 Heap 영역의 객체 단위.

Integer i = new Integer(4);

레퍼런스 변수 i는 새로운 Integer 객체 인스턴스를 가리킨다.

i=null;

레퍼런스 변수 i 는 null로 할당

이전에 만든 Integer객체 인스턴스는 unreachable object가 된다.

 

메모리 할당 해제 과정은 가비지 컬렉터에 의해 자동으로 실행.

 

 

Java Garbage Collector의 종류

Serial GC

-XX:+UseSerialGC

MinorGC, MajorGC모두 순차적으로 수행, Deletion and Compacting 수행

하나의 CPU로 Young영역과 Old 영역을 연속적으로 처리함. 컬렉션이 수행될 때 애플리케이션이 정지.

 

Parallel GC

-XX:+UseParallelGC

다른 CPU가 GC의 진행시간 동안 대기 상태로 남아 있는 것을 최소화 하는 것.

Serial Collector의 Young 영역에서 진행하는 컬렉션을 병렬 방식으로 처리하여 GC의 부하를 줄이고 성능을 향상.

여러 CPU를 효과적으로 활용하기 위해 GC수행시 멀테스레드를 사용.

Default로 young generation 에서만 멀티스레드를 활용하나, 옵션을 통해 old generation에서도 멀티스레딩 활용 가능. Deletion and Compacting 수행

 

CMS(Concurrent Mark Sweep) Colletor

-XX:+UseConcMarkSweepGC

가비지 컬렉션 작업을 애플리케이션 스레드와 동시 수행. stop-the-world 시간 최소화.  Compacting 수행하지 않아서 memory를 더 많이 차지.

CMS 컬렉터는 힙 메모리의 크기가 클 때 적합. Young 영역에 대한 처리 방법은 Parallel Collector의 Young 영역의 GC 알고리즘과 동일.

Old 영역의 GC는 다음 흐름과 같다

짧은 대기 시간으로 살아있는 객체를 찾는다 → 서버 수행시 살아있는객체에 표시를 한다. → 표시 도중에 변경된 객체에 대해 다시 표시한다. → 표시된 쓰레기를 정리한다.

CMS 방식에서는 컴팩션을 하지 않는다. 따라서 메모리를 몰아놓지 않으므로 다른 옵션을 사용해서 메로리를 모아주는 작업이 필요.

 

 

 

G1 Garbage Collector

-XX+UseG1GC

Java7부터 사용 가능. 여러 CPU와 아주 큰 memory에서 효과적인 GC를 활용하기 위함.

Oracle 문서에 따르면 heap size가 6GB보다 클 경우 GC의 latency를 0.5sec 이하로 낮출 수 있다고 한다. (Oracle GC1 GC문서) Java9에서는 default GC로 설정되어 있다.

Young영역과 Old 영역으로 나누는 방식을 사용하지 않는 특이한 컬렉터.

G1 컬렉터는 바둑판 모양으로 구성되어 있으며, 약 2000개의 구역을 사용.

이 바둑판 모양의 구역에서 일부를 선정하여 Young 영역을 지정한 후 해당 구역에 데이터가 꽉 차면 해당 블록만  GC를 진행.

메모리를 블록단위의 region으로 나누어서 데이터를 할당.  GC후 살아있는 객체만 Servivor영역으로 이동.

728x90