오늘의 목표
- 객체지향 프로그래밍
- JVM 구조
- 자바 Garbage Collector 동작 과정
객체지향 프로그래밍
- 캡슐화(Encapsulation): 객체의 속성과 메소드를 하나의 단위로 묶는 것입니다. 이를 통해 객체의 내부 구현을 외부로부터 숨기고, 외부에서는 객체의 메소드만을 사용하여 작업을 수행할 수 있습니다.
- 상속(Inheritance): 기존 클래스의 속성과 메소드를 새로운 클래스에 물려주는 것입니다. 이를 통해 코드의 재사용성이 증가하고, 중복 코드를 줄일 수 있습니다.
- 다형성(Polymorphism): 한 가지 인터페이스를 가지고 여러 가지 구현을 사용할 수 있는 기능입니다. 이를 통해 프로그램의 확장성과 유연성이 향상됩니다.
- 추상화(Abstraction): 복잡한 시스템을 간단한 개념으로 표현하는 것입니다. 객체들의 공통적인 속성과 메소드를 추출하여 공통 인터페이스를 정의함으로써 코드의 복잡성을 줄일 수 있습니다.
Garbage Collector
Young 영역(Young Generation)
- 새롭게 생성된 객체가 할당(Allocation)되는 영역
- 대부분의 객체가 금방 Unreachable 상태가 되기 때문에, 많은 객체가 Young 영역에 생성되었다가 사라진다.
- Young 영역에 대한 가비지 컬렉션(Garbage Collection)을 Minor GC라고 부른다
- Eden영역: 객체가 처음 생성되어 할당되는 공간입니다. Eden 영역이 가득 차게 되면 가비지 컬렉션이 발생합니다. 이 과정에서 살아남은 객체들은 다음 단계인 Survivor 영역 중 하나로 이동합니다.
- Survior 영역(S0,S1): 살아남은 객체들이 임시로 이동하는 공간으로, 두 개의 Survivor 영역이 존재합니다. 이 영역들은 살아남은 객체들을 복사하고 저장하는 용도로 사용됩니다. 이 과정을 통해, young 영역에서 객체들의 생존 시간을 추적하고, 여전히 사용되는 객체들만 남겨둡니다.
Old 영역(Old Generation)
- Young영역에서 Reachable 상태를 유지하여 살아남은 객체가 복사되는 영역
- Young 영역보다 크게 할당되며, 영역의 크기가 큰 만큼 가비지는 적게 발생한다.
- Old 영역에 대한 가비지 컬렉션(Garbage Collection)을 Major GC 또는 Full GC라고 부른다.
Unreachable 상태: 더이상 사용되지 않는 상태
GC Root:
시스템 클래스: JVM이 로드한 시스템 클래스들은 GC Root로 간주됩니다. 이런 시스템 클래스들은 메모리에서 회수되지 않습니다.
스레드 객체: 실행 중인 스레드는 GC Root로 간주되며, 이들 스레드가 참조하는 객체들은 가비지 컬렉션 대상이 아닙니다.
스택 프레임의 지역 변수와 매개변수: 각 스레드의 스택 프레임에 있는 지역 변수와 매개변수는 GC Root로 간주됩니다.
JNI 참조: Java Native Interface(JNI)를 통해 생성된 참조는 GC Root로 간주됩니다. 이들 참조는 네이티브 코드에서 Java 객체를 참조하기 위해 사용됩니다.
가비지 컬렉터 알고리즘
- 마크 앤 스위프: 루트(root)에서 시작하여 참조되는 객체들을 마킹하고, 마킹되지 않은 객체들을 회수하는 방법입니다.
- 참조 카운팅: 각 객체에 참조 카운터를 두어 참조되는 횟수를 기록하고, 참조 카운터가 0인 객체를 회수하는 방법입니다.
- 복사: 메모리를 두 개의 영역으로 나누고, 사용 중인 객체들을 한 영역에서 다른 영역으로 복사하면서 정리하는 방법입니다.
- Generational Collection:객체의 생존 시간에 따라 메모리를 세대별로 구분하여 관리하는 방법입니다. 이 방법에서는 새로 생성된 객체와 오래된 객체를 분리하여 관리하며, 가비지 컬렉션의 효율성을 높입니다.
- 네이티브 코드: 특정 하드웨어나 운영 체제에서 직접 실행될 수 있는 기계어로 컴파일된 프로그램 코드를 말합니다.
JVM 구조
- 클래스 로더
- 메모리 영역
- 실행엔진
메모리영역(Runtime Data Area): JVM의 메모리 영역은 다음과 같은 구성요소로 이루어져 있습니다:
- 메소드 영역(Method Area): 클래스 구조, 메소드 데이터, 필드 데이터, 상수 값 등의 클래스 수준의 정보를 저장합니다.
- 힙 영역(Heap Area): 자바 애플리케이션에서 생성되는 객체 인스턴스와 배열을 저장하는 영역입니다. 가비지 컬렉션의 대상이 되는 영역으로, 여기에 저장된 객체들은 자동으로 메모리 관리됩니다.
- 스택 영역(Stack Area): 메소드 호출과 지역 변수에 대한 메모리를 할당하는 영역입니다. 각 스레드마다 별도의 스택이 할당되며, 메소드 호출이 발생할 때마다 해당 스택에 프레임이 추가되고 메소드 실행이 완료되면 프레임이 제거됩니다.
- PC 레지스터(PC Register): 각 스레드에 대해 현재 실행 중인 명령의 주소를 가지고 있는 영역입니다.
- 네이티브 메소드 스택(Native Method Stack): 자바 이외의 언어로 작성된 네이티브 메소드를 위한 스택 영역입니다.
메소드 영역: 클래스 수준의 정보 저장
힙 영역: 힙이라는 데이터 저장 공간, 객체와 배열을 저장
스택 영역: 데이터를 임시로 저장하는 구조
'[F-Lab 66해빗 페이백 챌린지 ]' 카테고리의 다른 글
| [F-Lab 모각코 챌린지 6일차] 자바 예외 처리, 기타 개념 (0) | 2023.05.17 |
|---|---|
| [F-Lab 모각코 챌린지 5일차] 쓰레드 안전, Final, Static (2) | 2023.05.16 |
| [F-Lab 모각코 챌린지 4일차] 제네릭, 컬렉션 (2) | 2023.05.15 |
| [F-Lab 모각코 챌린지 3일차] 함수형 프로그래밍 (2) | 2023.05.11 |
| [F-Lab 모각코 챌린지 2일차] 객체는 무엇이고 객체 지향 프로그래밍은 무엇인가? (4가지 특성) (0) | 2023.05.10 |