새로운 내용을 공부할 때
새로운 내용의 공부를 시작할 때 용어의 정의를 이해하지 못하거나 정확하게 알지 못한다면 그 용어가 포함된 문장을 이해하지 못합니다.
작은 단어 하나가 내용을 이해하지 못하게 하기 때문에 용어를 정확하게 이해하는 것이 중요합니다.
가바지 컬렉션과 기타 학습
오늘은 가비지 컬렉션에 대해 학습했습니다.
가비지 컬렉션과 관련된 키워드부터 정리해보겠습니다.
불필요한 객체 생성으로 GC를 일하게 하는 행위
- String operation (“+”)
- 오토박싱 / 언박싱
- 방어적 복사
Old Generation으로 만드는 행위
- 중첩 클래스
- 가변 객체
GC하기 어려운 대상
- static
- 클래스 메타데이터
가비지 컬렉션이란
가비지 컬렉션은 동적 메모리 공간(Heap & Metaspace)에서 사용되지 않은 메모리를 해제하는 역할을 합니다.
기존 C,C++을 사용할 때는 별도의 소멸 메소드를 사용하거나 모두 사용한 뒤에는 동적 메모리 영역을 제거하는 행위를 합니다.
자바에서는 자동으로 동적 메모리 영역의 사용되지 않는 메모리를 제거합니다.
public static void main(String[] args){
Integer five = new Integer(5); // Eden 추가
}
새 인스턴스를 생성하면 힙 메모리 영역중 Young Gen
내부에 있는 Eden
에 저장됩니다.
이후 새 인스턴스가 계속 추가되어 Eden
이 꽉 차게 된다면 Minor GC
가 동작합니다.
동작할때 Mark
,Sweep
,Compact
방식으로 청소를 하게 됩니다.
- Mark - 살아있는 객체를 찾아 마킹을 합니다.
- Sweep - 참조하고 있지 않는 쓰레기 객체를 Heap에서 제거합니다.
- Compact - 살아있는 객체를 한 곳으로 모읍니다.
GC는 이 과정이 모두 종료되는 Eden
에 있는 객체를 S0(Survivor)
에 저장하게 됩니다.
이때 Eden
> S0
영역으로 이동 후 살아남은 객체의 age
를 1증가합니다.
다시 Eden
이 꽉차게 되면 GC가 동작하게 되고 1~3번이 동작후 이번엔 S1
에 영역을 옴깁니다.
이때 S0
에 있는 살아있는 객체도 이동하게 되며 똑같이 age를 1 증가합니다.
Desired survivor size 22020096 bytes, new threshold 7 (max 15)
이렇게 VM 옵션을 통해 OldGeneration
으로 가기 위한 현재 조건을 확인할 수 있습니다.
-
YoungGen을 정리하는 GC를
MinorGC
라고 합니다. -
OldGen영역을 정리하는 GC를 MajorGC라고 합니다.
GC가 동작할 때 모든 GC는 STW(Stop the world
)로 모든 어플리케이션이 일시정지가 됩니다.
MinorGC는 지연 시간이 짧고, MajorGC는 훨씬 긴 초 단위로 어플리케이션이 정지됩니다.
따라서 어플리케이션을 사용할 때 최대한 GC가 동작하지 않도록 코드를 작성하는 것이 중요합니다.
학습 정리
모르고 있던 내용
- static이 GC 대상이다.
- Major,Minor GC가 언제 동작하는지
- Method 영역(
PermGen
) 이나Metaspace
에Class
가 저장되는지 - 중첩 클래스, 오토박싱이 대량의 데이터에서 왜 사용하지 말라고 하는 이유
참고
- Runtime Data Area
- 커비의 가비지 컬렉션
- 이펙티브 자바
- 자바의 신 2권
댓글남기기