티스토리 뷰

공부

[Java] Garbage Collection

승가비 2021. 12. 8. 01:02
728x90

각 서비스의 WAS에서 생성하는 객체의 크기와 생존 주기가 모두 다르고, 장비의 종류도 다양하다. WAS의 스레드 개수와 장비당 WAS 인스턴스 개수, GC 옵션 등은 지속적인 튜닝과 모니터링을 통해서 해당 서비스에 가장 적합한 값을 찾아야 한다.

 

 

stop-the-world

GC 실행을 위해서 멈춤

GC 튜닝이란 stop-the-world 시간을 줄이는 것

 

null 할당

System.gc() 메서드 실행 - 절대 호출하면 안됨

 

weak genreational hypothesis

unreachable

오래된 객체에서 젊은 객체로의 참조는 아주 적게 존재

 

Young Generation: 새롭게 생성된, Minor GC

Old Generation: Young 살아남은 객체가 복사됨 Major(Full) GC 적게 발생

 

Allocation

Young Generation

Promotion

Old Generation

Permanent Generation

 

Permanent Generation: Method Area, Perm 영역, 영원히 남아 있는 곳은 아니다.

 

Old -> Young

Card Table

512 bytes chunk

write barrier 

 


Young

Eden

Survivor 2개

Eden -> (Survivor <-> GC <-> Survivor) -> Old

 

bump-the-pointer

Eden 영역에 할당된 마지막 객체를 추적

Eden 영역의 맨 위 top에 있다.

새로운 객체의 크기만 확인해서 Eden 영역에 넣기만 하면된다.

빠른 메모리 할당

 

TLABs(Thread-Local Allocation Buffers)

Thread-Safe하기 위해서

Eden 영역에 lock 발생

lock-contention 성능은 매우 떨어진다..

이를 해결하기 위해, 스레드가 각각의 몫에 해당하는 Eden 영역의 작은 덩어리를 가질 수 있도록

 


Old

 

Serial GC

절대 사용하면 안됨

데스크톱 CPU 코어 하나, 성능 떨어짐...;

mark-sweep-compact

적은 메모리 & CPU 코어 개수 적을때

 

Parallel GC

Searial GC + 스레드 여러개

메모리 충분 & CPU 코어 개수 많을때

Throughput GC

 

Parallel Old GC(Parallel Compacting GC)

Old GC 알고리즘 다름

Mark-Summary-Compaction

 

Concurrent Mark & Sweep GC(이하 CMS)

Initial Mark: 살아있는 객체, 매우 짧다

Concurrent Mark: 참조가 끊긴 객체

Concurrent Sweep: 쓰레기 정리

stop-the-world 시간이 매우 짧다

CMS GC

Low Latency GC

단점1: 메모리와 CPU 더 많이 사용

단점2: Compaction 단계가 없다.

조각난 메모리가 많아서 stop-the-world 시간이 길다

 

G1(Garbage First) GC

바둑판 각 영역에 객체를 할당

꽉차면 다른영역에 할당하고 GC

가장 큰 장점은 성능

 

https://d2.naver.com/helloworld/1329

https://medium.com/@joongwon/jvm-garbage-collection-algorithms-3869b7b0aa6f

 

[JVM] Garbage Collection Algorithms

Java 코드를 작성함에 있어서 JVM에 대해 이해를 하고 작성하는 것은 중요하다. Android를 개발할 때도 Android 플랫폼 특성에 대해 이해가 중요하듯이 Java 코드가 실행되는 환경에 대해 이해가 부족하

medium.com

 

https://d2.naver.com/helloworld/329631

 

728x90
댓글