728x90
java 홈페이지를 보면 java에 관련된 정보가 정리되어 있다
Garbage Collection in Java Overview - Dev.java
그 중 GC 관련 부분에서 개요 정도인
- Introduction to Garbage Collection
- Garbage collection in java
를 살펴 봤다.
Introduction to Garbage Collection
메모리 운영
class HelloWorld{
String message;
printHelloMessage(String name){
message = "Hello " + name;//New String instance "message" created
print(message);
} //reference to message is lost once scope leaves method
}
- 위 코드에서 printHelloMessage() 가 실행될 때마다 새로운 문자열이 message에 할당된다.
- 메모리 관리를 해주지 않으면 메모리가 모자라게 될 것이다.
- C, C++은 free, delete 호출로 직접 메모리 관리를 한다.
- 하지만 개발자들이 메모리를 직접 관리하는 것은 번거롭고 어렵다.
- 그래서 현대 대부분의 프로그래밍 언어는 garbage collector를 통해 자동으로 메모리를 관리한다.
Java의 메모리 운영
- java에서 JVM의 일부분인 GC(Garbage collector)로 메모리를 관리한다
- JVM에서 GC는 백그라운드 프로세스 이다.
- 주기적으로 사용되지 않는 object를 제거한다.
- 그리고 살아있는 object들을 재구성하여 메모리를 효율적으로 사용한다.
Garbage collection in java
GC types
- Serial Garbage Collector
- 싱글 스레드로 동작한다.
- 대체로 멈춰 있고 적은 리소스를 사용한다.
- single processor 시스템에 적합하다
- Parallel Garbage Collector
- Serial Garbage Collector와 비슷하다.
- 하지만 멀티 스레드를 사용한다.
- Concurrent Mark Sweep (CMS) Garbage Collector
- (Deprecated in JDK 9, Removed in JDK 14)
- GC로 인해 JVM이 멈추는 시간을 줄였다
- Garbage First (G1) Garbage Collector
- (Default since JDK 9)
- CMS를 개선해서 대체 하였다.
- 많은 메모리에 접근해야하는 멀티 프로세서에 적합하다.
- ZGC
- (Experimental in JDK 11, Production in JDK 15)
- 테라바이트 heap을 가진 application까지 확장 가능한 초저지연 GC이다.
- ZGC는 다른 GC와 동작방식이 다르다
(참고 : Deep-dive of ZGC's Architecture - Dev.java)
Heap Memory
Heap 메모리는 object의 “나이”에 따라 여러 영역으로 구분된다.
영역의 개수나 타입은 GC의 구현마다 다르다
- Generational Garbage Collection
- java의 대부분 GC에서 사용하는 방법이다.
- 대부분 객체들의 수명이 짧다는 것을 이용하도록 설계됐다.
- young & old 세대로 구분한다.
- 객체는 young 세대에서 시작한다. GC는 주기적으로 young 세대의 객체들이 참조되는지 확인한다.
- 객체가 살아남아 충분히 오래 됐다면 old 세대로 복사되고, 확인 주기가 길어진다.
- Generations
- Young Space
- Eden Space
- 첫 GC까지 여기에 저장된다
- Survivor Spaces
- 첫 GC 이후 살아남으면 여기로 복사된다.
- GC는 보통 여러개의 Survivor Space들을 가지고 있다.
- 목적은 새 survivor 영역으로 복사 후 이전 survivor 영역을 삭제하여
GC의 효율성을 향상 시키기 위함이다.
- Eden Space
- Old Region
- 충분히 살아 남은 객체들은 old region으로 옮겨진다.
- GC가 자주 확인하지 않게 된다.
- Permanent/Metaspace Region
- JVM 메타데이터, core system classes 등 사라지면 안되는 객체들이 저장된다
- Young Space
Garbage Collection Process
상위 계층에서 GC는 3가지 단계를 가진다.
mark, sweep, compaction
GC 구현에 따라 추가적인 하위 단계를 가질 수도 있다.
- Mark
- 객체가 생성될때 1bit 마킹 값이 0으로 설정된다.
- 마킹 값은 객체가 참조되는지 여부이다.
- GC가 객체 그래프를 따라가며 객체에 마킹 값을 1로 설정한다.
- 그래프는 root 오브젝트부터 시작하며, static 변수, 자바 스레드, JNI 등이 root가 될 수 있다.
- Sweep
- 이 단계 동안 마킹 값이 0 인 객체들은 제거된다
- Compaction
- 최종 단계로, 객체들이 살아남아 특정 조건을 만족하면 다음 세대(지역)으로 옮기거나 복사한다.
- Garbage Collection Pause
- GC가 동작하는 동안 JVM은 멈춘다.
- Heap 메모리는 thread safe하지 않기 때문이다.
- 객체들을 삭제하고, 옮기고 복사하는 동안 에러가 발생하는 것을 막기 위해서 JVM이 멈춘다.
- Types of Garbage Collections
- Minor garbage collections
- heap 메모리의 young regions만 검사한다. 자주 실행된다.
- Major garbage collections
- heap 메모리의 young & old regions 모두 검사한다.
- minor 보다 덜 실행된다
- JVM의 특정 조건에의해 실행되기도 한다. (ex. heap 메모리의 몇 % 이상 사용 시)
- Minor garbage collections
결론(내 생각)
1. GC는 heap 공간을 young, old 로 나눈다
2. GC는 Mark, Sweep, Compaction 프로세스를 거치며 young -> old 로 살아남은 객체들을 이동시킨다
3. GC가 동작하는 동안 JVM은 멈춘다
728x90
'Language > Java' 카테고리의 다른 글
[Java] JVM - Java virtual machine (0) | 2023.04.10 |
---|
댓글